[{"data":1,"prerenderedAt":1273},["ShallowReactive",2],{"\u002Fdocs\u002Fadvanced\u002Fcustom-memory":3},{"id":4,"title":5,"body":6,"description":1266,"extension":1267,"meta":1268,"navigation":86,"path":1269,"seo":1270,"stem":1271,"__hash__":1272},"docs\u002Fdocs\u002F5.advanced\u002F2.custom-memory.md","Custom Memory Backend",{"type":7,"value":8,"toc":1261},"minimark",[9,13,22,27,1102,1106,1201,1205,1257],[10,11,5],"h1",{"id":12},"custom-memory-backend",[14,15,16,17,21],"p",{},"Swap ChromaDB for any vector store by implementing ",[18,19,20],"code",{},"MemoryService",".",[23,24,26],"h2",{"id":25},"full-example-pinecone","Full example — Pinecone",[28,29,34],"pre",{"className":30,"code":31,"language":32,"meta":33,"style":33},"language-python shiki shiki-themes github-dark","from pinecone import Pinecone\nfrom mango.memory import MemoryService, MemoryEntry, TextMemoryEntry, make_entry_id\nfrom mango.core.types import MangoError\n\nclass PineconeMemory(MemoryService):\n\n    def __init__(self, api_key: str, index_name: str):\n        pc = Pinecone(api_key=api_key)\n        self._index = pc.Index(index_name)\n        self._embedder = MyEmbedder()   # bring your own embeddings\n\n    async def store(self, entry: MemoryEntry) -> None:\n        vector = await self._embedder.embed(entry.question)\n        self._index.upsert(vectors=[{\n            \"id\": entry.id,\n            \"values\": vector,\n            \"metadata\": {\n                \"question\": entry.question,\n                \"tool_name\": entry.tool_name,\n                \"tool_args\": json.dumps(entry.tool_args),\n                \"result_summary\": entry.result_summary,\n                \"timestamp\": entry.timestamp,\n                \"type\": \"tool\",\n            },\n        }])\n\n    async def retrieve(\n        self,\n        question: str,\n        top_k: int = 3,\n        similarity_threshold: float = 0.6,\n    ) -> list[MemoryEntry]:\n        vector = await self._embedder.embed(question)\n        results = self._index.query(\n            vector=vector,\n            top_k=top_k,\n            filter={\"type\": \"tool\"},\n            include_metadata=True,\n        )\n        entries = []\n        for match in results.matches:\n            if match.score \u003C similarity_threshold:\n                continue\n            m = match.metadata\n            entries.append(MemoryEntry(\n                id=match.id,\n                question=m[\"question\"],\n                tool_name=m[\"tool_name\"],\n                tool_args=json.loads(m[\"tool_args\"]),\n                result_summary=m[\"result_summary\"],\n                similarity=match.score,\n                timestamp=m[\"timestamp\"],\n            ))\n        return entries\n\n    async def delete(self, entry_id: str) -> None:\n        self._index.delete(ids=[entry_id])\n\n    async def save_text(self, text: str) -> str:\n        entry_id = make_entry_id()\n        vector = await self._embedder.embed(text)\n        self._index.upsert(vectors=[{\n            \"id\": entry_id,\n            \"values\": vector,\n            \"metadata\": {\"text\": text, \"type\": \"text\"},\n        }])\n        return entry_id\n\n    async def search_text(\n        self,\n        query: str,\n        top_k: int = 3,\n        similarity_threshold: float = 0.6,\n    ) -> list[TextMemoryEntry]:\n        vector = await self._embedder.embed(query)\n        results = self._index.query(\n            vector=vector,\n            top_k=top_k,\n            filter={\"type\": \"text\"},\n            include_metadata=True,\n        )\n        return [\n            TextMemoryEntry(id=m.id, text=m.metadata[\"text\"], similarity=m.score)\n            for m in results.matches\n            if m.score >= similarity_threshold\n        ]\n\n    def count(self) -> int:\n        stats = self._index.describe_index_stats()\n        return stats.total_vector_count\n","python","",[18,35,36,55,68,81,88,106,111,134,155,169,186,191,212,229,245,255,264,273,282,291,300,309,318,333,339,345,350,363,369,379,396,412,418,432,445,456,467,488,501,507,518,533,548,554,565,571,582,599,614,631,646,657,672,678,687,692,714,730,735,756,767,781,794,802,809,831,836,844,849,861,866,876,889,902,908,922,933,942,951,968,979,984,992,1027,1041,1055,1061,1066,1081,1094],{"__ignoreMap":33},[37,38,41,45,49,52],"span",{"class":39,"line":40},"line",1,[37,42,44],{"class":43},"snl16","from",[37,46,48],{"class":47},"s95oV"," pinecone ",[37,50,51],{"class":43},"import",[37,53,54],{"class":47}," Pinecone\n",[37,56,58,60,63,65],{"class":39,"line":57},2,[37,59,44],{"class":43},[37,61,62],{"class":47}," mango.memory ",[37,64,51],{"class":43},[37,66,67],{"class":47}," MemoryService, MemoryEntry, TextMemoryEntry, make_entry_id\n",[37,69,71,73,76,78],{"class":39,"line":70},3,[37,72,44],{"class":43},[37,74,75],{"class":47}," mango.core.types ",[37,77,51],{"class":43},[37,79,80],{"class":47}," MangoError\n",[37,82,84],{"class":39,"line":83},4,[37,85,87],{"emptyLinePlaceholder":86},true,"\n",[37,89,91,94,98,101,103],{"class":39,"line":90},5,[37,92,93],{"class":43},"class",[37,95,97],{"class":96},"svObZ"," PineconeMemory",[37,99,100],{"class":47},"(",[37,102,20],{"class":96},[37,104,105],{"class":47},"):\n",[37,107,109],{"class":39,"line":108},6,[37,110,87],{"emptyLinePlaceholder":86},[37,112,114,117,121,124,127,130,132],{"class":39,"line":113},7,[37,115,116],{"class":43},"    def",[37,118,120],{"class":119},"sDLfK"," __init__",[37,122,123],{"class":47},"(self, api_key: ",[37,125,126],{"class":119},"str",[37,128,129],{"class":47},", index_name: ",[37,131,126],{"class":119},[37,133,105],{"class":47},[37,135,137,140,143,146,150,152],{"class":39,"line":136},8,[37,138,139],{"class":47},"        pc ",[37,141,142],{"class":43},"=",[37,144,145],{"class":47}," Pinecone(",[37,147,149],{"class":148},"s9osk","api_key",[37,151,142],{"class":43},[37,153,154],{"class":47},"api_key)\n",[37,156,158,161,164,166],{"class":39,"line":157},9,[37,159,160],{"class":119},"        self",[37,162,163],{"class":47},"._index ",[37,165,142],{"class":43},[37,167,168],{"class":47}," pc.Index(index_name)\n",[37,170,172,174,177,179,182],{"class":39,"line":171},10,[37,173,160],{"class":119},[37,175,176],{"class":47},"._embedder ",[37,178,142],{"class":43},[37,180,181],{"class":47}," MyEmbedder()   ",[37,183,185],{"class":184},"sAwPA","# bring your own embeddings\n",[37,187,189],{"class":39,"line":188},11,[37,190,87],{"emptyLinePlaceholder":86},[37,192,194,197,200,203,206,209],{"class":39,"line":193},12,[37,195,196],{"class":43},"    async",[37,198,199],{"class":43}," def",[37,201,202],{"class":96}," store",[37,204,205],{"class":47},"(self, entry: MemoryEntry) -> ",[37,207,208],{"class":119},"None",[37,210,211],{"class":47},":\n",[37,213,215,218,220,223,226],{"class":39,"line":214},13,[37,216,217],{"class":47},"        vector ",[37,219,142],{"class":43},[37,221,222],{"class":43}," await",[37,224,225],{"class":119}," self",[37,227,228],{"class":47},"._embedder.embed(entry.question)\n",[37,230,232,234,237,240,242],{"class":39,"line":231},14,[37,233,160],{"class":119},[37,235,236],{"class":47},"._index.upsert(",[37,238,239],{"class":148},"vectors",[37,241,142],{"class":43},[37,243,244],{"class":47},"[{\n",[37,246,248,252],{"class":39,"line":247},15,[37,249,251],{"class":250},"sU2Wk","            \"id\"",[37,253,254],{"class":47},": entry.id,\n",[37,256,258,261],{"class":39,"line":257},16,[37,259,260],{"class":250},"            \"values\"",[37,262,263],{"class":47},": vector,\n",[37,265,267,270],{"class":39,"line":266},17,[37,268,269],{"class":250},"            \"metadata\"",[37,271,272],{"class":47},": {\n",[37,274,276,279],{"class":39,"line":275},18,[37,277,278],{"class":250},"                \"question\"",[37,280,281],{"class":47},": entry.question,\n",[37,283,285,288],{"class":39,"line":284},19,[37,286,287],{"class":250},"                \"tool_name\"",[37,289,290],{"class":47},": entry.tool_name,\n",[37,292,294,297],{"class":39,"line":293},20,[37,295,296],{"class":250},"                \"tool_args\"",[37,298,299],{"class":47},": json.dumps(entry.tool_args),\n",[37,301,303,306],{"class":39,"line":302},21,[37,304,305],{"class":250},"                \"result_summary\"",[37,307,308],{"class":47},": entry.result_summary,\n",[37,310,312,315],{"class":39,"line":311},22,[37,313,314],{"class":250},"                \"timestamp\"",[37,316,317],{"class":47},": entry.timestamp,\n",[37,319,321,324,327,330],{"class":39,"line":320},23,[37,322,323],{"class":250},"                \"type\"",[37,325,326],{"class":47},": ",[37,328,329],{"class":250},"\"tool\"",[37,331,332],{"class":47},",\n",[37,334,336],{"class":39,"line":335},24,[37,337,338],{"class":47},"            },\n",[37,340,342],{"class":39,"line":341},25,[37,343,344],{"class":47},"        }])\n",[37,346,348],{"class":39,"line":347},26,[37,349,87],{"emptyLinePlaceholder":86},[37,351,353,355,357,360],{"class":39,"line":352},27,[37,354,196],{"class":43},[37,356,199],{"class":43},[37,358,359],{"class":96}," retrieve",[37,361,362],{"class":47},"(\n",[37,364,366],{"class":39,"line":365},28,[37,367,368],{"class":47},"        self,\n",[37,370,372,375,377],{"class":39,"line":371},29,[37,373,374],{"class":47},"        question: ",[37,376,126],{"class":119},[37,378,332],{"class":47},[37,380,382,385,388,391,394],{"class":39,"line":381},30,[37,383,384],{"class":47},"        top_k: ",[37,386,387],{"class":119},"int",[37,389,390],{"class":43}," =",[37,392,393],{"class":119}," 3",[37,395,332],{"class":47},[37,397,399,402,405,407,410],{"class":39,"line":398},31,[37,400,401],{"class":47},"        similarity_threshold: ",[37,403,404],{"class":119},"float",[37,406,390],{"class":43},[37,408,409],{"class":119}," 0.6",[37,411,332],{"class":47},[37,413,415],{"class":39,"line":414},32,[37,416,417],{"class":47},"    ) -> list[MemoryEntry]:\n",[37,419,421,423,425,427,429],{"class":39,"line":420},33,[37,422,217],{"class":47},[37,424,142],{"class":43},[37,426,222],{"class":43},[37,428,225],{"class":119},[37,430,431],{"class":47},"._embedder.embed(question)\n",[37,433,435,438,440,442],{"class":39,"line":434},34,[37,436,437],{"class":47},"        results ",[37,439,142],{"class":43},[37,441,225],{"class":119},[37,443,444],{"class":47},"._index.query(\n",[37,446,448,451,453],{"class":39,"line":447},35,[37,449,450],{"class":148},"            vector",[37,452,142],{"class":43},[37,454,455],{"class":47},"vector,\n",[37,457,459,462,464],{"class":39,"line":458},36,[37,460,461],{"class":148},"            top_k",[37,463,142],{"class":43},[37,465,466],{"class":47},"top_k,\n",[37,468,470,473,475,478,481,483,485],{"class":39,"line":469},37,[37,471,472],{"class":148},"            filter",[37,474,142],{"class":43},[37,476,477],{"class":47},"{",[37,479,480],{"class":250},"\"type\"",[37,482,326],{"class":47},[37,484,329],{"class":250},[37,486,487],{"class":47},"},\n",[37,489,491,494,496,499],{"class":39,"line":490},38,[37,492,493],{"class":148},"            include_metadata",[37,495,142],{"class":43},[37,497,498],{"class":119},"True",[37,500,332],{"class":47},[37,502,504],{"class":39,"line":503},39,[37,505,506],{"class":47},"        )\n",[37,508,510,513,515],{"class":39,"line":509},40,[37,511,512],{"class":47},"        entries ",[37,514,142],{"class":43},[37,516,517],{"class":47}," []\n",[37,519,521,524,527,530],{"class":39,"line":520},41,[37,522,523],{"class":43},"        for",[37,525,526],{"class":47}," match ",[37,528,529],{"class":43},"in",[37,531,532],{"class":47}," results.matches:\n",[37,534,536,539,542,545],{"class":39,"line":535},42,[37,537,538],{"class":43},"            if",[37,540,541],{"class":47}," match.score ",[37,543,544],{"class":43},"\u003C",[37,546,547],{"class":47}," similarity_threshold:\n",[37,549,551],{"class":39,"line":550},43,[37,552,553],{"class":43},"                continue\n",[37,555,557,560,562],{"class":39,"line":556},44,[37,558,559],{"class":47},"            m ",[37,561,142],{"class":43},[37,563,564],{"class":47}," match.metadata\n",[37,566,568],{"class":39,"line":567},45,[37,569,570],{"class":47},"            entries.append(MemoryEntry(\n",[37,572,574,577,579],{"class":39,"line":573},46,[37,575,576],{"class":148},"                id",[37,578,142],{"class":43},[37,580,581],{"class":47},"match.id,\n",[37,583,585,588,590,593,596],{"class":39,"line":584},47,[37,586,587],{"class":148},"                question",[37,589,142],{"class":43},[37,591,592],{"class":47},"m[",[37,594,595],{"class":250},"\"question\"",[37,597,598],{"class":47},"],\n",[37,600,602,605,607,609,612],{"class":39,"line":601},48,[37,603,604],{"class":148},"                tool_name",[37,606,142],{"class":43},[37,608,592],{"class":47},[37,610,611],{"class":250},"\"tool_name\"",[37,613,598],{"class":47},[37,615,617,620,622,625,628],{"class":39,"line":616},49,[37,618,619],{"class":148},"                tool_args",[37,621,142],{"class":43},[37,623,624],{"class":47},"json.loads(m[",[37,626,627],{"class":250},"\"tool_args\"",[37,629,630],{"class":47},"]),\n",[37,632,634,637,639,641,644],{"class":39,"line":633},50,[37,635,636],{"class":148},"                result_summary",[37,638,142],{"class":43},[37,640,592],{"class":47},[37,642,643],{"class":250},"\"result_summary\"",[37,645,598],{"class":47},[37,647,649,652,654],{"class":39,"line":648},51,[37,650,651],{"class":148},"                similarity",[37,653,142],{"class":43},[37,655,656],{"class":47},"match.score,\n",[37,658,660,663,665,667,670],{"class":39,"line":659},52,[37,661,662],{"class":148},"                timestamp",[37,664,142],{"class":43},[37,666,592],{"class":47},[37,668,669],{"class":250},"\"timestamp\"",[37,671,598],{"class":47},[37,673,675],{"class":39,"line":674},53,[37,676,677],{"class":47},"            ))\n",[37,679,681,684],{"class":39,"line":680},54,[37,682,683],{"class":43},"        return",[37,685,686],{"class":47}," entries\n",[37,688,690],{"class":39,"line":689},55,[37,691,87],{"emptyLinePlaceholder":86},[37,693,695,697,699,702,705,707,710,712],{"class":39,"line":694},56,[37,696,196],{"class":43},[37,698,199],{"class":43},[37,700,701],{"class":96}," delete",[37,703,704],{"class":47},"(self, entry_id: ",[37,706,126],{"class":119},[37,708,709],{"class":47},") -> ",[37,711,208],{"class":119},[37,713,211],{"class":47},[37,715,717,719,722,725,727],{"class":39,"line":716},57,[37,718,160],{"class":119},[37,720,721],{"class":47},"._index.delete(",[37,723,724],{"class":148},"ids",[37,726,142],{"class":43},[37,728,729],{"class":47},"[entry_id])\n",[37,731,733],{"class":39,"line":732},58,[37,734,87],{"emptyLinePlaceholder":86},[37,736,738,740,742,745,748,750,752,754],{"class":39,"line":737},59,[37,739,196],{"class":43},[37,741,199],{"class":43},[37,743,744],{"class":96}," save_text",[37,746,747],{"class":47},"(self, text: ",[37,749,126],{"class":119},[37,751,709],{"class":47},[37,753,126],{"class":119},[37,755,211],{"class":47},[37,757,759,762,764],{"class":39,"line":758},60,[37,760,761],{"class":47},"        entry_id ",[37,763,142],{"class":43},[37,765,766],{"class":47}," make_entry_id()\n",[37,768,770,772,774,776,778],{"class":39,"line":769},61,[37,771,217],{"class":47},[37,773,142],{"class":43},[37,775,222],{"class":43},[37,777,225],{"class":119},[37,779,780],{"class":47},"._embedder.embed(text)\n",[37,782,784,786,788,790,792],{"class":39,"line":783},62,[37,785,160],{"class":119},[37,787,236],{"class":47},[37,789,239],{"class":148},[37,791,142],{"class":43},[37,793,244],{"class":47},[37,795,797,799],{"class":39,"line":796},63,[37,798,251],{"class":250},[37,800,801],{"class":47},": entry_id,\n",[37,803,805,807],{"class":39,"line":804},64,[37,806,260],{"class":250},[37,808,263],{"class":47},[37,810,812,814,817,820,823,825,827,829],{"class":39,"line":811},65,[37,813,269],{"class":250},[37,815,816],{"class":47},": {",[37,818,819],{"class":250},"\"text\"",[37,821,822],{"class":47},": text, ",[37,824,480],{"class":250},[37,826,326],{"class":47},[37,828,819],{"class":250},[37,830,487],{"class":47},[37,832,834],{"class":39,"line":833},66,[37,835,344],{"class":47},[37,837,839,841],{"class":39,"line":838},67,[37,840,683],{"class":43},[37,842,843],{"class":47}," entry_id\n",[37,845,847],{"class":39,"line":846},68,[37,848,87],{"emptyLinePlaceholder":86},[37,850,852,854,856,859],{"class":39,"line":851},69,[37,853,196],{"class":43},[37,855,199],{"class":43},[37,857,858],{"class":96}," search_text",[37,860,362],{"class":47},[37,862,864],{"class":39,"line":863},70,[37,865,368],{"class":47},[37,867,869,872,874],{"class":39,"line":868},71,[37,870,871],{"class":47},"        query: ",[37,873,126],{"class":119},[37,875,332],{"class":47},[37,877,879,881,883,885,887],{"class":39,"line":878},72,[37,880,384],{"class":47},[37,882,387],{"class":119},[37,884,390],{"class":43},[37,886,393],{"class":119},[37,888,332],{"class":47},[37,890,892,894,896,898,900],{"class":39,"line":891},73,[37,893,401],{"class":47},[37,895,404],{"class":119},[37,897,390],{"class":43},[37,899,409],{"class":119},[37,901,332],{"class":47},[37,903,905],{"class":39,"line":904},74,[37,906,907],{"class":47},"    ) -> list[TextMemoryEntry]:\n",[37,909,911,913,915,917,919],{"class":39,"line":910},75,[37,912,217],{"class":47},[37,914,142],{"class":43},[37,916,222],{"class":43},[37,918,225],{"class":119},[37,920,921],{"class":47},"._embedder.embed(query)\n",[37,923,925,927,929,931],{"class":39,"line":924},76,[37,926,437],{"class":47},[37,928,142],{"class":43},[37,930,225],{"class":119},[37,932,444],{"class":47},[37,934,936,938,940],{"class":39,"line":935},77,[37,937,450],{"class":148},[37,939,142],{"class":43},[37,941,455],{"class":47},[37,943,945,947,949],{"class":39,"line":944},78,[37,946,461],{"class":148},[37,948,142],{"class":43},[37,950,466],{"class":47},[37,952,954,956,958,960,962,964,966],{"class":39,"line":953},79,[37,955,472],{"class":148},[37,957,142],{"class":43},[37,959,477],{"class":47},[37,961,480],{"class":250},[37,963,326],{"class":47},[37,965,819],{"class":250},[37,967,487],{"class":47},[37,969,971,973,975,977],{"class":39,"line":970},80,[37,972,493],{"class":148},[37,974,142],{"class":43},[37,976,498],{"class":119},[37,978,332],{"class":47},[37,980,982],{"class":39,"line":981},81,[37,983,506],{"class":47},[37,985,987,989],{"class":39,"line":986},82,[37,988,683],{"class":43},[37,990,991],{"class":47}," [\n",[37,993,995,998,1001,1003,1006,1009,1011,1014,1016,1019,1022,1024],{"class":39,"line":994},83,[37,996,997],{"class":47},"            TextMemoryEntry(",[37,999,1000],{"class":148},"id",[37,1002,142],{"class":43},[37,1004,1005],{"class":47},"m.id, ",[37,1007,1008],{"class":148},"text",[37,1010,142],{"class":43},[37,1012,1013],{"class":47},"m.metadata[",[37,1015,819],{"class":250},[37,1017,1018],{"class":47},"], ",[37,1020,1021],{"class":148},"similarity",[37,1023,142],{"class":43},[37,1025,1026],{"class":47},"m.score)\n",[37,1028,1030,1033,1036,1038],{"class":39,"line":1029},84,[37,1031,1032],{"class":43},"            for",[37,1034,1035],{"class":47}," m ",[37,1037,529],{"class":43},[37,1039,1040],{"class":47}," results.matches\n",[37,1042,1044,1046,1049,1052],{"class":39,"line":1043},85,[37,1045,538],{"class":43},[37,1047,1048],{"class":47}," m.score ",[37,1050,1051],{"class":43},">=",[37,1053,1054],{"class":47}," similarity_threshold\n",[37,1056,1058],{"class":39,"line":1057},86,[37,1059,1060],{"class":47},"        ]\n",[37,1062,1064],{"class":39,"line":1063},87,[37,1065,87],{"emptyLinePlaceholder":86},[37,1067,1069,1071,1074,1077,1079],{"class":39,"line":1068},88,[37,1070,116],{"class":43},[37,1072,1073],{"class":96}," count",[37,1075,1076],{"class":47},"(self) -> ",[37,1078,387],{"class":119},[37,1080,211],{"class":47},[37,1082,1084,1087,1089,1091],{"class":39,"line":1083},89,[37,1085,1086],{"class":47},"        stats ",[37,1088,142],{"class":43},[37,1090,225],{"class":119},[37,1092,1093],{"class":47},"._index.describe_index_stats()\n",[37,1095,1097,1099],{"class":39,"line":1096},90,[37,1098,683],{"class":43},[37,1100,1101],{"class":47}," stats.total_vector_count\n",[23,1103,1105],{"id":1104},"use-it","Use it",[28,1107,1109],{"className":30,"code":1108,"language":32,"meta":33,"style":33},"memory = PineconeMemory(api_key=\"...\", index_name=\"mango-memory\")\n\ntools = ToolRegistry()\nfor tool in build_mongo_tools(db, memory):\n    tools.register(tool)\n\nagent = MangoAgent(..., agent_memory=memory)\n",[18,1110,1111,1142,1146,1156,1169,1174,1178],{"__ignoreMap":33},[37,1112,1113,1116,1118,1121,1123,1125,1128,1131,1134,1136,1139],{"class":39,"line":40},[37,1114,1115],{"class":47},"memory ",[37,1117,142],{"class":43},[37,1119,1120],{"class":47}," PineconeMemory(",[37,1122,149],{"class":148},[37,1124,142],{"class":43},[37,1126,1127],{"class":250},"\"...\"",[37,1129,1130],{"class":47},", ",[37,1132,1133],{"class":148},"index_name",[37,1135,142],{"class":43},[37,1137,1138],{"class":250},"\"mango-memory\"",[37,1140,1141],{"class":47},")\n",[37,1143,1144],{"class":39,"line":57},[37,1145,87],{"emptyLinePlaceholder":86},[37,1147,1148,1151,1153],{"class":39,"line":70},[37,1149,1150],{"class":47},"tools ",[37,1152,142],{"class":43},[37,1154,1155],{"class":47}," ToolRegistry()\n",[37,1157,1158,1161,1164,1166],{"class":39,"line":83},[37,1159,1160],{"class":43},"for",[37,1162,1163],{"class":47}," tool ",[37,1165,529],{"class":43},[37,1167,1168],{"class":47}," build_mongo_tools(db, memory):\n",[37,1170,1171],{"class":39,"line":90},[37,1172,1173],{"class":47},"    tools.register(tool)\n",[37,1175,1176],{"class":39,"line":108},[37,1177,87],{"emptyLinePlaceholder":86},[37,1179,1180,1183,1185,1188,1191,1193,1196,1198],{"class":39,"line":113},[37,1181,1182],{"class":47},"agent ",[37,1184,142],{"class":43},[37,1186,1187],{"class":47}," MangoAgent(",[37,1189,1190],{"class":119},"...",[37,1192,1130],{"class":47},[37,1194,1195],{"class":148},"agent_memory",[37,1197,142],{"class":43},[37,1199,1200],{"class":47},"memory)\n",[23,1202,1204],{"id":1203},"key-rules","Key rules",[1206,1207,1208,1230,1236,1245,1250],"ul",{},[1209,1210,1211,1130,1214,1130,1217,1130,1220,1130,1223,1226,1227],"li",{},[18,1212,1213],{},"store()",[18,1215,1216],{},"retrieve()",[18,1218,1219],{},"delete()",[18,1221,1222],{},"save_text()",[18,1224,1225],{},"search_text()"," are all ",[18,1228,1229],{},"async",[1209,1231,1232,1235],{},[18,1233,1234],{},"count()"," is synchronous",[1209,1237,1238,1240,1241,1244],{},[18,1239,1216],{}," must populate ",[18,1242,1243],{},"entry.similarity"," on returned entries",[1209,1246,1247,1249],{},[18,1248,1222],{}," must return the generated entry ID",[1209,1251,1252,1253,1256],{},"Separate tool-usage memories from text memories (use metadata ",[18,1254,1255],{},"type"," field or separate indexes)",[1258,1259,1260],"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 .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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);}",{"title":33,"searchDepth":57,"depth":57,"links":1262},[1263,1264,1265],{"id":25,"depth":57,"text":26},{"id":1104,"depth":57,"text":1105},{"id":1203,"depth":57,"text":1204},"Implement MemoryService to use any vector store.","md",{},"\u002Fdocs\u002Fadvanced\u002Fcustom-memory",{"title":5,"description":1266},"docs\u002F5.advanced\u002F2.custom-memory","2yCMBtgwxSSRglcuaDcz62qAdeaYUSQWwALGAw303BQ",1776189332212]