[{"data":1,"prerenderedAt":845},["ShallowReactive",2],{"\u002Fdocs\u002Fcore-concepts\u002Fmemory":3},{"id":4,"title":5,"body":6,"description":838,"extension":839,"meta":840,"navigation":94,"path":841,"seo":842,"stem":843,"__hash__":844},"docs\u002Fdocs\u002F2.core-concepts\u002F3.memory.md","Memory",{"type":7,"value":8,"toc":829},"minimark",[9,13,17,22,54,57,61,157,164,194,198,201,277,280,284,474,478,574,578,666,670,677,816,825],[10,11,5],"h1",{"id":12},"memory",[14,15,16],"p",{},"Mango uses a vector store to remember successful interactions. Every time a query works correctly, it is saved. The next time you ask a similar question, that example is injected into the prompt — making the answer faster and more accurate.",[18,19,21],"h2",{"id":20},"how-it-works","How it works",[23,24,25,38,48],"ol",{},[26,27,28,32,33,37],"li",{},[29,30,31],"strong",{},"Store"," — after a successful tool call, ",[34,35,36],"code",{},"(question, tool_name, tool_args, result_summary)"," is saved automatically.",[26,39,40,43,44,47],{},[29,41,42],{},"Retrieve"," — at the start of each ",[34,45,46],{},"ask()",", the memory is searched for questions semantically similar to the current one.",[26,49,50,53],{},[29,51,52],{},"Inject"," — matches above the similarity threshold are added to the system prompt as few-shot examples.",[14,55,56],{},"This happens transparently. You don't need to manage it manually.",[18,58,60],{"id":59},"setup","Setup",[62,63,68],"pre",{"className":64,"code":65,"language":66,"meta":67,"style":67},"language-python shiki shiki-themes github-dark","from mango.integrations.chromadb import ChromaAgentMemory\n\n# Persistent (survives restarts)\nmemory = ChromaAgentMemory(persist_dir=\".\u002Fmango_memory\")\n\n# In-memory (for testing)\nmemory = ChromaAgentMemory(persist_dir=\":memory:\")\n","python","",[34,69,70,89,96,103,128,133,139],{"__ignoreMap":67},[71,72,75,79,83,86],"span",{"class":73,"line":74},"line",1,[71,76,78],{"class":77},"snl16","from",[71,80,82],{"class":81},"s95oV"," mango.integrations.chromadb ",[71,84,85],{"class":77},"import",[71,87,88],{"class":81}," ChromaAgentMemory\n",[71,90,92],{"class":73,"line":91},2,[71,93,95],{"emptyLinePlaceholder":94},true,"\n",[71,97,99],{"class":73,"line":98},3,[71,100,102],{"class":101},"sAwPA","# Persistent (survives restarts)\n",[71,104,106,109,112,115,119,121,125],{"class":73,"line":105},4,[71,107,108],{"class":81},"memory ",[71,110,111],{"class":77},"=",[71,113,114],{"class":81}," ChromaAgentMemory(",[71,116,118],{"class":117},"s9osk","persist_dir",[71,120,111],{"class":77},[71,122,124],{"class":123},"sU2Wk","\".\u002Fmango_memory\"",[71,126,127],{"class":81},")\n",[71,129,131],{"class":73,"line":130},5,[71,132,95],{"emptyLinePlaceholder":94},[71,134,136],{"class":73,"line":135},6,[71,137,138],{"class":101},"# In-memory (for testing)\n",[71,140,142,144,146,148,150,152,155],{"class":73,"line":141},7,[71,143,108],{"class":81},[71,145,111],{"class":77},[71,147,114],{"class":81},[71,149,118],{"class":117},[71,151,111],{"class":77},[71,153,154],{"class":123},"\":memory:\"",[71,156,127],{"class":81},[14,158,159,160,163],{},"Pass memory to ",[34,161,162],{},"MangoAgent",":",[62,165,167],{"className":64,"code":166,"language":66,"meta":67,"style":67},"agent = MangoAgent(..., agent_memory=memory)\n",[34,168,169],{"__ignoreMap":67},[71,170,171,174,176,179,183,186,189,191],{"class":73,"line":74},[71,172,173],{"class":81},"agent ",[71,175,111],{"class":77},[71,177,178],{"class":81}," MangoAgent(",[71,180,182],{"class":181},"sDLfK","...",[71,184,185],{"class":81},", ",[71,187,188],{"class":117},"agent_memory",[71,190,111],{"class":77},[71,192,193],{"class":81},"memory)\n",[18,195,197],{"id":196},"pre-load-domain-knowledge","Pre-load domain knowledge",[14,199,200],{},"You can save free-form text that the LLM can retrieve when relevant:",[62,202,204],{"className":64,"code":203,"language":66,"meta":67,"style":67},"# Business terminology\nawait memory.save_text(\"'active user' means a user with at least one order in the last 90 days\")\nawait memory.save_text(\"'revenue' always refers to the total_amount field in the orders collection\")\n\n# Field semantics\nawait memory.save_text(\"the status field uses integers: 1=pending, 2=shipped, 3=delivered, 4=cancelled\")\n\n# Relationships\nawait memory.save_text(\"orders.user_id references the _id field in the users collection\")\n",[34,205,206,211,224,235,239,244,255,259,265],{"__ignoreMap":67},[71,207,208],{"class":73,"line":74},[71,209,210],{"class":101},"# Business terminology\n",[71,212,213,216,219,222],{"class":73,"line":91},[71,214,215],{"class":77},"await",[71,217,218],{"class":81}," memory.save_text(",[71,220,221],{"class":123},"\"'active user' means a user with at least one order in the last 90 days\"",[71,223,127],{"class":81},[71,225,226,228,230,233],{"class":73,"line":98},[71,227,215],{"class":77},[71,229,218],{"class":81},[71,231,232],{"class":123},"\"'revenue' always refers to the total_amount field in the orders collection\"",[71,234,127],{"class":81},[71,236,237],{"class":73,"line":105},[71,238,95],{"emptyLinePlaceholder":94},[71,240,241],{"class":73,"line":130},[71,242,243],{"class":101},"# Field semantics\n",[71,245,246,248,250,253],{"class":73,"line":135},[71,247,215],{"class":77},[71,249,218],{"class":81},[71,251,252],{"class":123},"\"the status field uses integers: 1=pending, 2=shipped, 3=delivered, 4=cancelled\"",[71,254,127],{"class":81},[71,256,257],{"class":73,"line":141},[71,258,95],{"emptyLinePlaceholder":94},[71,260,262],{"class":73,"line":261},8,[71,263,264],{"class":101},"# Relationships\n",[71,266,268,270,272,275],{"class":73,"line":267},9,[71,269,215],{"class":77},[71,271,218],{"class":81},[71,273,274],{"class":123},"\"orders.user_id references the _id field in the users collection\"",[71,276,127],{"class":81},[14,278,279],{},"The LLM will retrieve these when answering questions that touch on these concepts.",[18,281,283],{"id":282},"inspect-whats-stored","Inspect what's stored",[62,285,287],{"className":64,"code":286,"language":66,"meta":67,"style":67},"# Search for entries similar to a question\nentries = await memory.retrieve(\n    \"how many users signed up last month?\",\n    top_k=10,\n    similarity_threshold=0.0,  # 0.0 = return everything\n)\nfor e in entries:\n    print(f\"{e.question} → {e.tool_name}({e.tool_args}) [{e.similarity:.2f}]\")\n\n# Count total stored entries\nprint(f\"Total memories: {memory.count()}\")\n\n# Delete an entry\nawait memory.delete(entry_id)\n",[34,288,289,294,307,315,327,343,347,361,421,425,431,455,460,466],{"__ignoreMap":67},[71,290,291],{"class":73,"line":74},[71,292,293],{"class":101},"# Search for entries similar to a question\n",[71,295,296,299,301,304],{"class":73,"line":91},[71,297,298],{"class":81},"entries ",[71,300,111],{"class":77},[71,302,303],{"class":77}," await",[71,305,306],{"class":81}," memory.retrieve(\n",[71,308,309,312],{"class":73,"line":98},[71,310,311],{"class":123},"    \"how many users signed up last month?\"",[71,313,314],{"class":81},",\n",[71,316,317,320,322,325],{"class":73,"line":105},[71,318,319],{"class":117},"    top_k",[71,321,111],{"class":77},[71,323,324],{"class":181},"10",[71,326,314],{"class":81},[71,328,329,332,334,337,340],{"class":73,"line":130},[71,330,331],{"class":117},"    similarity_threshold",[71,333,111],{"class":77},[71,335,336],{"class":181},"0.0",[71,338,339],{"class":81},",  ",[71,341,342],{"class":101},"# 0.0 = return everything\n",[71,344,345],{"class":73,"line":135},[71,346,127],{"class":81},[71,348,349,352,355,358],{"class":73,"line":141},[71,350,351],{"class":77},"for",[71,353,354],{"class":81}," e ",[71,356,357],{"class":77},"in",[71,359,360],{"class":81}," entries:\n",[71,362,363,366,369,372,375,378,381,384,387,389,392,394,396,398,401,403,406,408,411,414,416,419],{"class":73,"line":261},[71,364,365],{"class":181},"    print",[71,367,368],{"class":81},"(",[71,370,371],{"class":77},"f",[71,373,374],{"class":123},"\"",[71,376,377],{"class":181},"{",[71,379,380],{"class":81},"e.question",[71,382,383],{"class":181},"}",[71,385,386],{"class":123}," → ",[71,388,377],{"class":181},[71,390,391],{"class":81},"e.tool_name",[71,393,383],{"class":181},[71,395,368],{"class":123},[71,397,377],{"class":181},[71,399,400],{"class":81},"e.tool_args",[71,402,383],{"class":181},[71,404,405],{"class":123},") [",[71,407,377],{"class":181},[71,409,410],{"class":81},"e.similarity",[71,412,413],{"class":77},":.2f",[71,415,383],{"class":181},[71,417,418],{"class":123},"]\"",[71,420,127],{"class":81},[71,422,423],{"class":73,"line":267},[71,424,95],{"emptyLinePlaceholder":94},[71,426,428],{"class":73,"line":427},10,[71,429,430],{"class":101},"# Count total stored entries\n",[71,432,434,437,439,441,444,446,449,451,453],{"class":73,"line":433},11,[71,435,436],{"class":181},"print",[71,438,368],{"class":81},[71,440,371],{"class":77},[71,442,443],{"class":123},"\"Total memories: ",[71,445,377],{"class":181},[71,447,448],{"class":81},"memory.count()",[71,450,383],{"class":181},[71,452,374],{"class":123},[71,454,127],{"class":81},[71,456,458],{"class":73,"line":457},12,[71,459,95],{"emptyLinePlaceholder":94},[71,461,463],{"class":73,"line":462},13,[71,464,465],{"class":101},"# Delete an entry\n",[71,467,469,471],{"class":73,"line":468},14,[71,470,215],{"class":77},[71,472,473],{"class":81}," memory.delete(entry_id)\n",[18,475,477],{"id":476},"memoryentry","MemoryEntry",[62,479,481],{"className":64,"code":480,"language":66,"meta":67,"style":67},"@dataclass\nclass MemoryEntry:\n    id: str\n    question: str       # original natural language question\n    tool_name: str      # tool that was called\n    tool_args: dict     # exact arguments that worked\n    result_summary: str # first 300 chars of the result\n    similarity: float   # filled by retrieve(), cosine similarity score\n    timestamp: str      # ISO timestamp\n",[34,482,483,489,500,511,522,532,543,553,564],{"__ignoreMap":67},[71,484,485],{"class":73,"line":74},[71,486,488],{"class":487},"svObZ","@dataclass\n",[71,490,491,494,497],{"class":73,"line":91},[71,492,493],{"class":77},"class",[71,495,496],{"class":487}," MemoryEntry",[71,498,499],{"class":81},":\n",[71,501,502,505,508],{"class":73,"line":98},[71,503,504],{"class":181},"    id",[71,506,507],{"class":81},": ",[71,509,510],{"class":181},"str\n",[71,512,513,516,519],{"class":73,"line":105},[71,514,515],{"class":81},"    question: ",[71,517,518],{"class":181},"str",[71,520,521],{"class":101},"       # original natural language question\n",[71,523,524,527,529],{"class":73,"line":130},[71,525,526],{"class":81},"    tool_name: ",[71,528,518],{"class":181},[71,530,531],{"class":101},"      # tool that was called\n",[71,533,534,537,540],{"class":73,"line":135},[71,535,536],{"class":81},"    tool_args: ",[71,538,539],{"class":181},"dict",[71,541,542],{"class":101},"     # exact arguments that worked\n",[71,544,545,548,550],{"class":73,"line":141},[71,546,547],{"class":81},"    result_summary: ",[71,549,518],{"class":181},[71,551,552],{"class":101}," # first 300 chars of the result\n",[71,554,555,558,561],{"class":73,"line":261},[71,556,557],{"class":81},"    similarity: ",[71,559,560],{"class":181},"float",[71,562,563],{"class":101},"   # filled by retrieve(), cosine similarity score\n",[71,565,566,569,571],{"class":73,"line":267},[71,567,568],{"class":81},"    timestamp: ",[71,570,518],{"class":181},[71,572,573],{"class":101},"      # ISO timestamp\n",[18,575,577],{"id":576},"configuration","Configuration",[579,580,581,597],"table",{},[582,583,584],"thead",{},[585,586,587,591,594],"tr",{},[588,589,590],"th",{},"Parameter",[588,592,593],{},"Default",[588,595,596],{},"Description",[598,599,600,618,633,651],"tbody",{},[585,601,602,607,612],{},[603,604,605],"td",{},[34,606,118],{},[603,608,609],{},[34,610,611],{},"\".mango_memory\"",[603,613,614,615,617],{},"Directory for ChromaDB storage. Use ",[34,616,154],{}," for ephemeral.",[585,619,620,625,630],{},[603,621,622],{},[34,623,624],{},"collection_name",[603,626,627],{},[34,628,629],{},"\"mango_memory\"",[603,631,632],{},"Base name for ChromaDB collections.",[585,634,635,640,645],{},[603,636,637],{},[34,638,639],{},"memory_top_k",[603,641,642],{},[34,643,644],{},"3",[603,646,647,648,650],{},"Max examples to inject per question (set on ",[34,649,162],{},").",[585,652,653,658,663],{},[603,654,655],{},[34,656,657],{},"similarity_threshold",[603,659,660],{},[34,661,662],{},"0.6",[603,664,665],{},"Minimum similarity score to include an example.",[18,667,669],{"id":668},"custom-memory-backend","Custom memory backend",[14,671,672,673,676],{},"Mango's memory system is built on an abstract interface. Implement ",[34,674,675],{},"MemoryService"," to use any vector store:",[62,678,680],{"className":64,"code":679,"language":66,"meta":67,"style":67},"from mango.memory import MemoryService\n\nclass MyPineconeMemory(MemoryService):\n    async def store(self, entry: MemoryEntry) -> None: ...\n    async def retrieve(self, question, top_k, similarity_threshold) -> list[MemoryEntry]: ...\n    async def delete(self, entry_id) -> None: ...\n    async def save_text(self, text) -> str: ...\n    async def search_text(self, query, top_k, similarity_threshold) -> list[TextMemoryEntry]: ...\n    def count(self) -> int: ...\n",[34,681,682,694,698,712,734,748,766,784,798],{"__ignoreMap":67},[71,683,684,686,689,691],{"class":73,"line":74},[71,685,78],{"class":77},[71,687,688],{"class":81}," mango.memory ",[71,690,85],{"class":77},[71,692,693],{"class":81}," MemoryService\n",[71,695,696],{"class":73,"line":91},[71,697,95],{"emptyLinePlaceholder":94},[71,699,700,702,705,707,709],{"class":73,"line":98},[71,701,493],{"class":77},[71,703,704],{"class":487}," MyPineconeMemory",[71,706,368],{"class":81},[71,708,675],{"class":487},[71,710,711],{"class":81},"):\n",[71,713,714,717,720,723,726,729,731],{"class":73,"line":105},[71,715,716],{"class":77},"    async",[71,718,719],{"class":77}," def",[71,721,722],{"class":487}," store",[71,724,725],{"class":81},"(self, entry: MemoryEntry) -> ",[71,727,728],{"class":181},"None",[71,730,507],{"class":81},[71,732,733],{"class":181},"...\n",[71,735,736,738,740,743,746],{"class":73,"line":130},[71,737,716],{"class":77},[71,739,719],{"class":77},[71,741,742],{"class":487}," retrieve",[71,744,745],{"class":81},"(self, question, top_k, similarity_threshold) -> list[MemoryEntry]: ",[71,747,733],{"class":181},[71,749,750,752,754,757,760,762,764],{"class":73,"line":135},[71,751,716],{"class":77},[71,753,719],{"class":77},[71,755,756],{"class":487}," delete",[71,758,759],{"class":81},"(self, entry_id) -> ",[71,761,728],{"class":181},[71,763,507],{"class":81},[71,765,733],{"class":181},[71,767,768,770,772,775,778,780,782],{"class":73,"line":141},[71,769,716],{"class":77},[71,771,719],{"class":77},[71,773,774],{"class":487}," save_text",[71,776,777],{"class":81},"(self, text) -> ",[71,779,518],{"class":181},[71,781,507],{"class":81},[71,783,733],{"class":181},[71,785,786,788,790,793,796],{"class":73,"line":261},[71,787,716],{"class":77},[71,789,719],{"class":77},[71,791,792],{"class":487}," search_text",[71,794,795],{"class":81},"(self, query, top_k, similarity_threshold) -> list[TextMemoryEntry]: ",[71,797,733],{"class":181},[71,799,800,803,806,809,812,814],{"class":73,"line":267},[71,801,802],{"class":77},"    def",[71,804,805],{"class":487}," count",[71,807,808],{"class":81},"(self) -> ",[71,810,811],{"class":181},"int",[71,813,507],{"class":81},[71,815,733],{"class":181},[14,817,818,819,824],{},"→ See ",[820,821,823],"a",{"href":822},"\u002Fdocs\u002Fadvanced\u002Fcustom-memory","Custom Memory Backend"," for the full guide.",[826,827,828],"style",{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":67,"searchDepth":91,"depth":91,"links":830},[831,832,833,834,835,836,837],{"id":20,"depth":91,"text":21},{"id":59,"depth":91,"text":60},{"id":196,"depth":91,"text":197},{"id":282,"depth":91,"text":283},{"id":476,"depth":91,"text":477},{"id":576,"depth":91,"text":577},{"id":668,"depth":91,"text":669},"How Mango learns from past interactions.","md",{},"\u002Fdocs\u002Fcore-concepts\u002Fmemory",{"title":5,"description":838},"docs\u002F2.core-concepts\u002F3.memory","n2jEz8Ef7-sNHPgtQ-ML-yKL5hhReKKflNFKfsEkqu8",1776189331966]