[{"data":1,"prerenderedAt":1400},["ShallowReactive",2],{"/open_source/modules/mem_reader":3,"surround-/open_source/modules/mem_reader":1384},{"id":4,"title":5,"avatar":6,"banner":6,"body":7,"category":6,"desc":1377,"description":287,"extension":1378,"links":6,"meta":1379,"navigation":6,"path":1380,"seo":1381,"stem":1382,"__hash__":1383},"docs/en/open_source/modules/mem_reader.md","MemReader",null,{"type":8,"value":9,"toc":1356},"minimark",[10,15,23,26,48,51,55,58,63,96,100,130,132,136,139,188,190,194,265,267,271,278,281,409,416,419,511,527,529,533,537,542,830,834,839,1173,1177,1180,1299,1301,1305,1312,1352],[11,12,14],"h2",{"id":13},"_1-overview","1. Overview",[16,17,18,19,22],"p",{},"When building AI applications, we often run into this problem: users send all kinds of things—casual chat messages, PDF documents, and images. ",[20,21,5],"strong",{}," turns these raw inputs (Raw Data) into standard memory blocks (Memory Items) with embeddings and metadata.",[16,24,25],{},"In short, it does three things:",[27,28,29,36,42],"ol",{},[30,31,32,35],"li",{},[20,33,34],{},"Normalization",": Whether you send a string or JSON, it first converts everything into a standard format.",[30,37,38,41],{},[20,39,40],{},"Chunking",": It splits long conversations or documents into appropriately sized chunks for downstream processing.",[30,43,44,47],{},[20,45,46],{},"Extraction",": It calls an LLM to extract unstructured information into structured knowledge points (Fine mode), or directly generates snapshots (Fast mode).",[49,50],"hr",{},[11,52,54],{"id":53},"_2-core-modes","2. Core Modes",[16,56,57],{},"MemReader provides two modes, corresponding to the needs for “speed” and “accuracy”:",[59,60,62],"h3",{"id":61},"fast-mode-speed-first","⚡ Fast Mode (speed first)",[64,65,66,76,90],"ul",{},[30,67,68,71,72,75],{},[20,69,70],{},"Characteristics",": ",[20,73,74],{},"Does not call an LLM",", only performs chunking and embeddings.",[30,77,78,81,82],{},[20,79,80],{},"Use cases",":\n",[64,83,84,87],{},[30,85,86],{},"Users are sending messages quickly and the system needs millisecond-level responses.",[30,88,89],{},"You only need to keep “snapshots” of the conversation, without deep understanding.",[30,91,92,95],{},[20,93,94],{},"Output",": raw text chunks + vector index.",[59,97,99],{"id":98},"fine-mode-carefully-crafted","🧠 Fine Mode (carefully crafted)",[64,101,102,110,125],{},[30,103,104,71,106,109],{},[20,105,70],{},[20,107,108],{},"Calls an LLM"," for deeper analysis.",[30,111,112,81,114],{},[20,113,80],{},[64,115,116,119,122],{},[30,117,118],{},"Long-term memory writing (needs key facts extracted).",[30,120,121],{},"Document analysis (needs core ideas summarized).",[30,123,124],{},"Multimodal understanding (needs to understand what’s in an image).",[30,126,127,129],{},[20,128,94],{},": structured facts + summary (Background) + provenance tracking (Provenance).",[49,131],{},[11,133,135],{"id":134},"_3-code-structure","3. Code Structure",[16,137,138],{},"MemReader’s code structure is straightforward and mainly includes:",[64,140,141,150,161,172],{},[30,142,143,149],{},[20,144,145],{},[146,147,148],"code",{},"base.py",": defines the interface contract that all Readers must follow.",[30,151,152,71,157,160],{},[20,153,154],{},[146,155,156],{},"simple_struct.py",[20,158,159],{},"the most commonly used implementation",". Focuses on pure-text conversations and local documents; lightweight and efficient.",[30,162,163,71,168,171],{},[20,164,165],{},[146,166,167],{},"multi_modal_struct.py",[20,169,170],{},"an all-rounder",". Handles images, file URLs, tool calls, and other complex inputs.",[30,173,174,179,180,183,184,187],{},[20,175,176],{},[146,177,178],{},"read_multi_modal/",": contains various parsers, such as ",[146,181,182],{},"ImageParser"," for images and ",[146,185,186],{},"FileParser"," for files.",[49,189],{},[11,191,193],{"id":192},"_4-how-to-choose","4. How to Choose?",[195,196,197,214],"table",{},[198,199,200],"thead",{},[201,202,203,208,211],"tr",{},[204,205,207],"th",{"align":206},"left","Your need",[204,209,210],{"align":206},"Recommended choice",[204,212,213],{"align":206},"Why",[215,216,217,233,248],"tbody",{},[201,218,219,225,230],{},[220,221,222],"td",{"align":206},[20,223,224],{},"Only process plain text chats",[220,226,227],{"align":206},[146,228,229],{},"SimpleStructMemReader",[220,231,232],{"align":206},"Simple, direct, and performant.",[201,234,235,240,245],{},[220,236,237],{"align":206},[20,238,239],{},"Need to handle images and file links",[220,241,242],{"align":206},[146,243,244],{},"MultiModalStructMemReader",[220,246,247],{"align":206},"Built-in multimodal parsing.",[201,249,250,255,262],{},[220,251,252],{"align":206},[20,253,254],{},"Upgrade from Fast to Fine",[220,256,257,258,261],{"align":206},"Any Reader’s ",[146,259,260],{},"fine_transfer"," method",[220,263,264],{"align":206},"Supports a progressive “store first, refine later” strategy.",[49,266],{},[11,268,270],{"id":269},"_5-api-overview","5. API Overview",[59,272,274,275],{"id":273},"unified-factory-memreaderfactory","Unified Factory: ",[146,276,277],{},"MemReaderFactory",[16,279,280],{},"Don’t instantiate readers directly; using the factory pattern is best practice:",[282,283,288],"pre",{"className":284,"code":285,"language":286,"meta":287,"style":287},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from memos.configs.mem_reader import MemReaderConfigFactory\nfrom memos.mem_reader.factory import MemReaderFactory\n\n# Create a Reader from configuration\ncfg = MemReaderConfigFactory.model_validate({...})\nreader = MemReaderFactory.from_config(cfg)\n","python","",[146,289,290,321,343,350,357,384],{"__ignoreMap":287},[291,292,295,299,303,307,310,312,315,318],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"s7zQu","from",[291,300,302],{"class":301},"sTEyZ"," memos",[291,304,306],{"class":305},"sMK4o",".",[291,308,309],{"class":301},"configs",[291,311,306],{"class":305},[291,313,314],{"class":301},"mem_reader ",[291,316,317],{"class":297},"import",[291,319,320],{"class":301}," MemReaderConfigFactory\n",[291,322,324,326,328,330,333,335,338,340],{"class":293,"line":323},2,[291,325,298],{"class":297},[291,327,302],{"class":301},[291,329,306],{"class":305},[291,331,332],{"class":301},"mem_reader",[291,334,306],{"class":305},[291,336,337],{"class":301},"factory ",[291,339,317],{"class":297},[291,341,342],{"class":301}," MemReaderFactory\n",[291,344,346],{"class":293,"line":345},3,[291,347,349],{"emptyLinePlaceholder":348},true,"\n",[291,351,353],{"class":293,"line":352},4,[291,354,356],{"class":355},"sHwdD","# Create a Reader from configuration\n",[291,358,360,363,366,369,371,375,378,381],{"class":293,"line":359},5,[291,361,362],{"class":301},"cfg ",[291,364,365],{"class":305},"=",[291,367,368],{"class":301}," MemReaderConfigFactory",[291,370,306],{"class":305},[291,372,374],{"class":373},"s2Zo4","model_validate",[291,376,377],{"class":305},"({",[291,379,380],{"class":373},"...",[291,382,383],{"class":305},"})\n",[291,385,387,390,392,395,397,400,403,406],{"class":293,"line":386},6,[291,388,389],{"class":301},"reader ",[291,391,365],{"class":305},[291,393,394],{"class":301}," MemReaderFactory",[291,396,306],{"class":305},[291,398,399],{"class":373},"from_config",[291,401,402],{"class":305},"(",[291,404,405],{"class":373},"cfg",[291,407,408],{"class":305},")\n",[59,410,412,413],{"id":411},"core-method-get_memory","Core Method: ",[146,414,415],{},"get_memory()",[16,417,418],{},"This is the method you will call most often.",[282,420,422],{"className":284,"code":421,"language":286,"meta":287,"style":287},"memories = reader.get_memory(\n    scene_data,       # your input data\n    type=\"chat\",      # type: chat or doc\n    info=user_info,   # user info (user_id, session_id)\n    mode=\"fine\"       # mode: fast or fine (highly recommended to specify explicitly!)\n)\n",[146,423,424,442,453,475,490,507],{"__ignoreMap":287},[291,425,426,429,431,434,436,439],{"class":293,"line":294},[291,427,428],{"class":301},"memories ",[291,430,365],{"class":305},[291,432,433],{"class":301}," reader",[291,435,306],{"class":305},[291,437,438],{"class":373},"get_memory",[291,440,441],{"class":305},"(\n",[291,443,444,447,450],{"class":293,"line":323},[291,445,446],{"class":373},"    scene_data",[291,448,449],{"class":305},",",[291,451,452],{"class":355},"       # your input data\n",[291,454,455,459,461,464,468,470,472],{"class":293,"line":345},[291,456,458],{"class":457},"sHdIc","    type",[291,460,365],{"class":305},[291,462,463],{"class":305},"\"",[291,465,467],{"class":466},"sfazB","chat",[291,469,463],{"class":305},[291,471,449],{"class":305},[291,473,474],{"class":355},"      # type: chat or doc\n",[291,476,477,480,482,485,487],{"class":293,"line":352},[291,478,479],{"class":457},"    info",[291,481,365],{"class":305},[291,483,484],{"class":373},"user_info",[291,486,449],{"class":305},[291,488,489],{"class":355},"   # user info (user_id, session_id)\n",[291,491,492,495,497,499,502,504],{"class":293,"line":359},[291,493,494],{"class":457},"    mode",[291,496,365],{"class":305},[291,498,463],{"class":305},[291,500,501],{"class":466},"fine",[291,503,463],{"class":305},[291,505,506],{"class":355},"       # mode: fast or fine (highly recommended to specify explicitly!)\n",[291,508,509],{"class":293,"line":386},[291,510,408],{"class":305},[64,512,513],{},[30,514,515,71,518,521,522],{},[20,516,517],{},"Return value",[146,519,520],{},"list[list[TextualMemoryItem]]",".\n",[64,523,524],{},[30,525,526],{},"Why a nested list? Because a long conversation may be split into multiple windows. The outer list represents windows, and the inner list represents memory items extracted from that window.",[49,528],{},[11,530,532],{"id":531},"_6-practical-development","6. Practical Development",[59,534,536],{"id":535},"scenario-1-processing-simple-chat-logs","Scenario 1: Processing simple chat logs",[16,538,539,540,306],{},"This is the most basic usage, with ",[146,541,229],{},[282,543,545],{"className":284,"code":544,"language":286,"meta":287,"style":287},"# 1. Prepare input: standard OpenAI-style conversation format\nconversation = [\n    [\n        {\"role\": \"user\", \"content\": \"I have a meeting tomorrow at 3pm\"},\n        {\"role\": \"assistant\", \"content\": \"What is the meeting about?\"},\n        {\"role\": \"user\", \"content\": \"Discussing the Q4 project deadline\"},\n    ]\n]\n\n# 2. Extract memory (Fine mode)\nmemories = reader.get_memory(\n    conversation,\n    type=\"chat\",\n    mode=\"fine\",\n    info={\"user_id\": \"u1\", \"session_id\": \"s1\"}\n)\n\n# 3. Result\n# memories will include extracted facts, e.g., \"User has a meeting tomorrow at 3pm about the Q4 project deadline\"\n",[146,546,547,552,562,567,611,649,686,692,698,703,709,724,733,748,763,808,813,818,824],{"__ignoreMap":287},[291,548,549],{"class":293,"line":294},[291,550,551],{"class":355},"# 1. Prepare input: standard OpenAI-style conversation format\n",[291,553,554,557,559],{"class":293,"line":323},[291,555,556],{"class":301},"conversation ",[291,558,365],{"class":305},[291,560,561],{"class":305}," [\n",[291,563,564],{"class":293,"line":345},[291,565,566],{"class":305},"    [\n",[291,568,569,572,574,577,579,582,585,588,590,592,594,597,599,601,603,606,608],{"class":293,"line":352},[291,570,571],{"class":305},"        {",[291,573,463],{"class":305},[291,575,576],{"class":466},"role",[291,578,463],{"class":305},[291,580,581],{"class":305},":",[291,583,584],{"class":305}," \"",[291,586,587],{"class":466},"user",[291,589,463],{"class":305},[291,591,449],{"class":305},[291,593,584],{"class":305},[291,595,596],{"class":466},"content",[291,598,463],{"class":305},[291,600,581],{"class":305},[291,602,584],{"class":305},[291,604,605],{"class":466},"I have a meeting tomorrow at 3pm",[291,607,463],{"class":305},[291,609,610],{"class":305},"},\n",[291,612,613,615,617,619,621,623,625,628,630,632,634,636,638,640,642,645,647],{"class":293,"line":359},[291,614,571],{"class":305},[291,616,463],{"class":305},[291,618,576],{"class":466},[291,620,463],{"class":305},[291,622,581],{"class":305},[291,624,584],{"class":305},[291,626,627],{"class":466},"assistant",[291,629,463],{"class":305},[291,631,449],{"class":305},[291,633,584],{"class":305},[291,635,596],{"class":466},[291,637,463],{"class":305},[291,639,581],{"class":305},[291,641,584],{"class":305},[291,643,644],{"class":466},"What is the meeting about?",[291,646,463],{"class":305},[291,648,610],{"class":305},[291,650,651,653,655,657,659,661,663,665,667,669,671,673,675,677,679,682,684],{"class":293,"line":386},[291,652,571],{"class":305},[291,654,463],{"class":305},[291,656,576],{"class":466},[291,658,463],{"class":305},[291,660,581],{"class":305},[291,662,584],{"class":305},[291,664,587],{"class":466},[291,666,463],{"class":305},[291,668,449],{"class":305},[291,670,584],{"class":305},[291,672,596],{"class":466},[291,674,463],{"class":305},[291,676,581],{"class":305},[291,678,584],{"class":305},[291,680,681],{"class":466},"Discussing the Q4 project deadline",[291,683,463],{"class":305},[291,685,610],{"class":305},[291,687,689],{"class":293,"line":688},7,[291,690,691],{"class":305},"    ]\n",[291,693,695],{"class":293,"line":694},8,[291,696,697],{"class":305},"]\n",[291,699,701],{"class":293,"line":700},9,[291,702,349],{"emptyLinePlaceholder":348},[291,704,706],{"class":293,"line":705},10,[291,707,708],{"class":355},"# 2. Extract memory (Fine mode)\n",[291,710,712,714,716,718,720,722],{"class":293,"line":711},11,[291,713,428],{"class":301},[291,715,365],{"class":305},[291,717,433],{"class":301},[291,719,306],{"class":305},[291,721,438],{"class":373},[291,723,441],{"class":305},[291,725,727,730],{"class":293,"line":726},12,[291,728,729],{"class":373},"    conversation",[291,731,732],{"class":305},",\n",[291,734,736,738,740,742,744,746],{"class":293,"line":735},13,[291,737,458],{"class":457},[291,739,365],{"class":305},[291,741,463],{"class":305},[291,743,467],{"class":466},[291,745,463],{"class":305},[291,747,732],{"class":305},[291,749,751,753,755,757,759,761],{"class":293,"line":750},14,[291,752,494],{"class":457},[291,754,365],{"class":305},[291,756,463],{"class":305},[291,758,501],{"class":466},[291,760,463],{"class":305},[291,762,732],{"class":305},[291,764,766,768,771,773,776,778,780,782,785,787,789,791,794,796,798,800,803,805],{"class":293,"line":765},15,[291,767,479],{"class":457},[291,769,770],{"class":305},"={",[291,772,463],{"class":305},[291,774,775],{"class":466},"user_id",[291,777,463],{"class":305},[291,779,581],{"class":305},[291,781,584],{"class":305},[291,783,784],{"class":466},"u1",[291,786,463],{"class":305},[291,788,449],{"class":305},[291,790,584],{"class":305},[291,792,793],{"class":466},"session_id",[291,795,463],{"class":305},[291,797,581],{"class":305},[291,799,584],{"class":305},[291,801,802],{"class":466},"s1",[291,804,463],{"class":305},[291,806,807],{"class":305},"}\n",[291,809,811],{"class":293,"line":810},16,[291,812,408],{"class":305},[291,814,816],{"class":293,"line":815},17,[291,817,349],{"emptyLinePlaceholder":348},[291,819,821],{"class":293,"line":820},18,[291,822,823],{"class":355},"# 3. Result\n",[291,825,827],{"class":293,"line":826},19,[291,828,829],{"class":355},"# memories will include extracted facts, e.g., \"User has a meeting tomorrow at 3pm about the Q4 project deadline\"\n",[59,831,833],{"id":832},"scenario-2-processing-multimodal-inputs","Scenario 2: Processing multimodal inputs",[16,835,836,837,306],{},"When users send images or file links, switch to ",[146,838,244],{},[282,840,842],{"className":284,"code":841,"language":286,"meta":287,"style":287},"# 1. Prepare input: a complex message containing files and images\nscene_data = [\n    [\n        {\n            \"role\": \"user\",\n            \"content\": [\n                {\"type\": \"text\", \"text\": \"Check this file and image\"},\n                # Files support automatic download and parsing via URL\n                {\"type\": \"file\", \"file\": {\"file_data\": \"https://example.com/readme.md\"}},\n                # Images support URL\n                {\"type\": \"image_url\", \"image_url\": {\"url\": \"https://example.com/chart.png\"}},\n            ]\n        }\n    ]\n]\n\n# 2. Extract memory\nmemories = multimodal_reader.get_memory(\n    scene_data,\n    type=\"chat\",\n    mode=\"fine\", # Only Fine mode invokes the vision model to parse images\n    info={\"user_id\": \"u1\", \"session_id\": \"s1\"}\n)\n",[146,843,844,849,858,862,867,886,898,938,943,994,999,1048,1053,1058,1062,1066,1070,1075,1090,1096,1111,1129,1168],{"__ignoreMap":287},[291,845,846],{"class":293,"line":294},[291,847,848],{"class":355},"# 1. Prepare input: a complex message containing files and images\n",[291,850,851,854,856],{"class":293,"line":323},[291,852,853],{"class":301},"scene_data ",[291,855,365],{"class":305},[291,857,561],{"class":305},[291,859,860],{"class":293,"line":345},[291,861,566],{"class":305},[291,863,864],{"class":293,"line":352},[291,865,866],{"class":305},"        {\n",[291,868,869,872,874,876,878,880,882,884],{"class":293,"line":359},[291,870,871],{"class":305},"            \"",[291,873,576],{"class":466},[291,875,463],{"class":305},[291,877,581],{"class":305},[291,879,584],{"class":305},[291,881,587],{"class":466},[291,883,463],{"class":305},[291,885,732],{"class":305},[291,887,888,890,892,894,896],{"class":293,"line":386},[291,889,871],{"class":305},[291,891,596],{"class":466},[291,893,463],{"class":305},[291,895,581],{"class":305},[291,897,561],{"class":305},[291,899,900,903,905,908,910,912,914,917,919,921,923,925,927,929,931,934,936],{"class":293,"line":688},[291,901,902],{"class":305},"                {",[291,904,463],{"class":305},[291,906,907],{"class":466},"type",[291,909,463],{"class":305},[291,911,581],{"class":305},[291,913,584],{"class":305},[291,915,916],{"class":466},"text",[291,918,463],{"class":305},[291,920,449],{"class":305},[291,922,584],{"class":305},[291,924,916],{"class":466},[291,926,463],{"class":305},[291,928,581],{"class":305},[291,930,584],{"class":305},[291,932,933],{"class":466},"Check this file and image",[291,935,463],{"class":305},[291,937,610],{"class":305},[291,939,940],{"class":293,"line":694},[291,941,942],{"class":355},"                # Files support automatic download and parsing via URL\n",[291,944,945,947,949,951,953,955,957,960,962,964,966,968,970,972,975,977,980,982,984,986,989,991],{"class":293,"line":700},[291,946,902],{"class":305},[291,948,463],{"class":305},[291,950,907],{"class":466},[291,952,463],{"class":305},[291,954,581],{"class":305},[291,956,584],{"class":305},[291,958,959],{"class":466},"file",[291,961,463],{"class":305},[291,963,449],{"class":305},[291,965,584],{"class":305},[291,967,959],{"class":466},[291,969,463],{"class":305},[291,971,581],{"class":305},[291,973,974],{"class":305}," {",[291,976,463],{"class":305},[291,978,979],{"class":466},"file_data",[291,981,463],{"class":305},[291,983,581],{"class":305},[291,985,584],{"class":305},[291,987,988],{"class":466},"https://example.com/readme.md",[291,990,463],{"class":305},[291,992,993],{"class":305},"}},\n",[291,995,996],{"class":293,"line":705},[291,997,998],{"class":355},"                # Images support URL\n",[291,1000,1001,1003,1005,1007,1009,1011,1013,1016,1018,1020,1022,1024,1026,1028,1030,1032,1035,1037,1039,1041,1044,1046],{"class":293,"line":711},[291,1002,902],{"class":305},[291,1004,463],{"class":305},[291,1006,907],{"class":466},[291,1008,463],{"class":305},[291,1010,581],{"class":305},[291,1012,584],{"class":305},[291,1014,1015],{"class":466},"image_url",[291,1017,463],{"class":305},[291,1019,449],{"class":305},[291,1021,584],{"class":305},[291,1023,1015],{"class":466},[291,1025,463],{"class":305},[291,1027,581],{"class":305},[291,1029,974],{"class":305},[291,1031,463],{"class":305},[291,1033,1034],{"class":466},"url",[291,1036,463],{"class":305},[291,1038,581],{"class":305},[291,1040,584],{"class":305},[291,1042,1043],{"class":466},"https://example.com/chart.png",[291,1045,463],{"class":305},[291,1047,993],{"class":305},[291,1049,1050],{"class":293,"line":726},[291,1051,1052],{"class":305},"            ]\n",[291,1054,1055],{"class":293,"line":735},[291,1056,1057],{"class":305},"        }\n",[291,1059,1060],{"class":293,"line":750},[291,1061,691],{"class":305},[291,1063,1064],{"class":293,"line":765},[291,1065,697],{"class":305},[291,1067,1068],{"class":293,"line":810},[291,1069,349],{"emptyLinePlaceholder":348},[291,1071,1072],{"class":293,"line":815},[291,1073,1074],{"class":355},"# 2. Extract memory\n",[291,1076,1077,1079,1081,1084,1086,1088],{"class":293,"line":820},[291,1078,428],{"class":301},[291,1080,365],{"class":305},[291,1082,1083],{"class":301}," multimodal_reader",[291,1085,306],{"class":305},[291,1087,438],{"class":373},[291,1089,441],{"class":305},[291,1091,1092,1094],{"class":293,"line":826},[291,1093,446],{"class":373},[291,1095,732],{"class":305},[291,1097,1099,1101,1103,1105,1107,1109],{"class":293,"line":1098},20,[291,1100,458],{"class":457},[291,1102,365],{"class":305},[291,1104,463],{"class":305},[291,1106,467],{"class":466},[291,1108,463],{"class":305},[291,1110,732],{"class":305},[291,1112,1114,1116,1118,1120,1122,1124,1126],{"class":293,"line":1113},21,[291,1115,494],{"class":457},[291,1117,365],{"class":305},[291,1119,463],{"class":305},[291,1121,501],{"class":466},[291,1123,463],{"class":305},[291,1125,449],{"class":305},[291,1127,1128],{"class":355}," # Only Fine mode invokes the vision model to parse images\n",[291,1130,1132,1134,1136,1138,1140,1142,1144,1146,1148,1150,1152,1154,1156,1158,1160,1162,1164,1166],{"class":293,"line":1131},22,[291,1133,479],{"class":457},[291,1135,770],{"class":305},[291,1137,463],{"class":305},[291,1139,775],{"class":466},[291,1141,463],{"class":305},[291,1143,581],{"class":305},[291,1145,584],{"class":305},[291,1147,784],{"class":466},[291,1149,463],{"class":305},[291,1151,449],{"class":305},[291,1153,584],{"class":305},[291,1155,793],{"class":466},[291,1157,463],{"class":305},[291,1159,581],{"class":305},[291,1161,584],{"class":305},[291,1163,802],{"class":466},[291,1165,463],{"class":305},[291,1167,807],{"class":305},[291,1169,1171],{"class":293,"line":1170},23,[291,1172,408],{"class":305},[59,1174,1176],{"id":1175},"scenario-3-progressive-optimization-fine-transfer","Scenario 3: Progressive optimization (Fine Transfer)",[16,1178,1179],{},"For better UX, you can first store the conversation quickly in Fast mode, then “refine” it into Fine memories when the system is idle.",[282,1181,1183],{"className":284,"code":1182,"language":286,"meta":287,"style":287},"# 1. Store quickly first (millisecond-level)\nfast_memories = reader.get_memory(conversation, mode=\"fast\", ...)\n\n# ... store into the database ...\n\n# 2. Refine asynchronously in the background\nrefined_memories = reader.fine_transfer_simple_mem(\n    fast_memories_flat_list, # Note: pass a flattened list of Items here\n    type=\"chat\"\n)\n\n# 3. Replace the original fast_memories with refined_memories\n",[146,1184,1185,1190,1229,1233,1238,1242,1247,1263,1273,1286,1290,1294],{"__ignoreMap":287},[291,1186,1187],{"class":293,"line":294},[291,1188,1189],{"class":355},"# 1. Store quickly first (millisecond-level)\n",[291,1191,1192,1195,1197,1199,1201,1203,1205,1208,1210,1213,1215,1217,1220,1222,1224,1227],{"class":293,"line":323},[291,1193,1194],{"class":301},"fast_memories ",[291,1196,365],{"class":305},[291,1198,433],{"class":301},[291,1200,306],{"class":305},[291,1202,438],{"class":373},[291,1204,402],{"class":305},[291,1206,1207],{"class":373},"conversation",[291,1209,449],{"class":305},[291,1211,1212],{"class":457}," mode",[291,1214,365],{"class":305},[291,1216,463],{"class":305},[291,1218,1219],{"class":466},"fast",[291,1221,463],{"class":305},[291,1223,449],{"class":305},[291,1225,1226],{"class":373}," ...",[291,1228,408],{"class":305},[291,1230,1231],{"class":293,"line":345},[291,1232,349],{"emptyLinePlaceholder":348},[291,1234,1235],{"class":293,"line":352},[291,1236,1237],{"class":355},"# ... store into the database ...\n",[291,1239,1240],{"class":293,"line":359},[291,1241,349],{"emptyLinePlaceholder":348},[291,1243,1244],{"class":293,"line":386},[291,1245,1246],{"class":355},"# 2. Refine asynchronously in the background\n",[291,1248,1249,1252,1254,1256,1258,1261],{"class":293,"line":688},[291,1250,1251],{"class":301},"refined_memories ",[291,1253,365],{"class":305},[291,1255,433],{"class":301},[291,1257,306],{"class":305},[291,1259,1260],{"class":373},"fine_transfer_simple_mem",[291,1262,441],{"class":305},[291,1264,1265,1268,1270],{"class":293,"line":694},[291,1266,1267],{"class":373},"    fast_memories_flat_list",[291,1269,449],{"class":305},[291,1271,1272],{"class":355}," # Note: pass a flattened list of Items here\n",[291,1274,1275,1277,1279,1281,1283],{"class":293,"line":700},[291,1276,458],{"class":457},[291,1278,365],{"class":305},[291,1280,463],{"class":305},[291,1282,467],{"class":466},[291,1284,1285],{"class":305},"\"\n",[291,1287,1288],{"class":293,"line":705},[291,1289,408],{"class":305},[291,1291,1292],{"class":293,"line":711},[291,1293,349],{"emptyLinePlaceholder":348},[291,1295,1296],{"class":293,"line":726},[291,1297,1298],{"class":355},"# 3. Replace the original fast_memories with refined_memories\n",[49,1300],{},[11,1302,1304],{"id":1303},"_7-configuration-notes","7. Configuration Notes",[16,1306,1307,1308,1311],{},"In ",[146,1309,1310],{},".env"," or configuration files, you can adjust these key parameters:",[64,1313,1314,1325,1336],{},[30,1315,1316,71,1321,1324],{},[20,1317,1318],{},[146,1319,1320],{},"chat_window_max_tokens",[20,1322,1323],{},"sliding window size",". Default is 1024. It determines how much context is packed together for processing. Too small may lose context; too large may exceed the LLM token limit.",[30,1326,1327,71,1332,1335],{},[20,1328,1329],{},[146,1330,1331],{},"remove_prompt_example",[20,1333,1334],{},"whether to remove examples from the prompt",". Set to True if you want to save tokens; set to False if extraction quality is not good (keep few-shot examples).",[30,1337,1338,1343,1344,1347,1348,1351],{},[20,1339,1340],{},[146,1341,1342],{},"direct_markdown_hostnames"," (multimodal only): ",[20,1345,1346],{},"hostname allowlist",". If a file URL’s hostname is in this list (e.g., ",[146,1349,1350],{},"raw.githubusercontent.com","), the Reader treats it as Markdown text directly instead of trying OCR or conversion, which is more efficient.",[1353,1354,1355],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}",{"title":287,"searchDepth":323,"depth":323,"links":1357},[1358,1359,1363,1364,1365,1371,1376],{"id":13,"depth":323,"text":14},{"id":53,"depth":323,"text":54,"children":1360},[1361,1362],{"id":61,"depth":345,"text":62},{"id":98,"depth":345,"text":99},{"id":134,"depth":323,"text":135},{"id":192,"depth":323,"text":193},{"id":269,"depth":323,"text":270,"children":1366},[1367,1369],{"id":273,"depth":345,"text":1368},"Unified Factory: MemReaderFactory",{"id":411,"depth":345,"text":1370},"Core Method: get_memory()",{"id":531,"depth":323,"text":532,"children":1372},[1373,1374,1375],{"id":535,"depth":345,"text":536},{"id":832,"depth":345,"text":833},{"id":1175,"depth":345,"text":1176},{"id":1303,"depth":323,"text":1304},"MemReader is MemOS's “memory translator”. It translates messy user inputs (chat, documents, images) into structured memory fragments the system can understand.","md",{},"/en/open_source/modules/mem_reader",{"title":5,"description":287},"en/open_source/modules/mem_reader","Z4_fl1tjERcLnJiFxeZVWPeSttwtZwr_XEBiSGZ9KCA",[1385,1393],{"title":1386,"path":1387,"stem":1388,"icon":1389,"framework":6,"module":6,"class":1390,"target":-1,"active":1391,"defaultOpen":1391,"children":-1,"description":1392},"MemCube","/open_source/modules/mem_cube","open_source/modules/mem_cube","i-ri-checkbox-multiple-blank-line",[],false,"MemCube is the core organizational unit in MemOS, designed to encapsulate and manage all types of memory for a user or agent. It provides a unified interface for loading, saving, and operating on multiple memory modules, making it easy to build, share, and deploy memory-augmented applications.",{"title":1394,"path":1395,"stem":1396,"icon":1397,"framework":6,"module":6,"class":1398,"target":-1,"active":1391,"defaultOpen":1391,"children":-1,"description":1399},"MemScheduler","/open_source/modules/mem_scheduler","open_source/modules/mem_scheduler","i-ri-calendar-line",[],"MemScheduler is a concurrent memory management system parallel running with the MemOS system, which coordinates memory operations between working memory, long-term memory, and activation memory in AI systems. It handles memory retrieval, updates, and compaction through event-driven scheduling. \u003Cbr/> This system is particularly suited for conversational agents and reasoning systems requiring dynamic memory management.",1770372083922]