[{"data":1,"prerenderedAt":5800},["ShallowReactive",2],{"\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler":3,"surround-\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler":5784},{"id":4,"title":5,"avatar":6,"banner":6,"body":7,"category":6,"desc":5777,"description":178,"extension":5778,"links":6,"meta":5779,"navigation":6,"path":5780,"seo":5781,"stem":5782,"__hash__":5783},"docs\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler.md","MemScheduler",null,{"type":8,"value":9,"toc":5753},"minimark",[10,14,61,65,72,77,103,107,128,132,147,151,157,161,172,481,484,487,490,501,712,716,723,740,973,977,980,1244,1247,1251,1258,1783,1787,1850,1853,1857,1860,4275,4279,4282,5749],[11,12,13],"h2",{"id":13},"主要特性",[15,16,17,26,33,40,47,54],"ul",{},[18,19,20,21,25],"li",{},"🚀 ",[22,23,24],"strong",{},"与 MemOS 系统并发操作","：独立线程\u002F进程运行，不阻塞主业务逻辑。",[18,27,28,29,32],{},"🧠 ",[22,30,31],{},"多记忆协调","：智能管理工作记忆、长时记忆和用户个性化记忆的流转。",[18,34,35,36,39],{},"⚡ ",[22,37,38],{},"事件驱动调度","：基于消息队列（Redis\u002FLocal）的异步任务分发机制。",[18,41,42,43,46],{},"🔍 ",[22,44,45],{},"高效检索","：集成向量检索与图谱检索，快速定位相关记忆。",[18,48,49,50,53],{},"📊 ",[22,51,52],{},"全面监控","：实时监控记忆使用率、任务队列状态和调度延迟。",[18,55,56,57,60],{},"📝 ",[22,58,59],{},"详细日志记录","：全链路追踪记忆操作，便于调试和系统分析。",[11,62,64],{"id":63},"memscheduler-架构","MemScheduler 架构",[66,67,68,71],"p",{},[69,70,5],"code",{}," 采用模块化架构，分为三层：",[73,74,76],"h3",{"id":75},"调度层核心","调度层（核心）",[78,79,80,97],"ol",{},[18,81,82,85,86,89,90,89,93,96],{},[22,83,84],{},"调度器（路由器）","：智能消息路由器，根据消息类型（",[69,87,88],{},"QUERY",", ",[69,91,92],{},"ANSWER",[69,94,95],{},"MEM_UPDATE"," 等）将任务分发给对应的处理器。",[18,98,99,102],{},[22,100,101],{},"消息处理","：通过带有特定标签（Label）的消息驱动业务逻辑，定义消息格式和处理规则。",[73,104,106],{"id":105},"执行层保障","执行层（保障）",[78,108,110,116,122],{"start":109},3,[18,111,112,115],{},[22,113,114],{},"任务队列","：支持 Redis Stream（生产环境）和 Local Queue（开发测试）两种模式，提供异步任务缓冲和持久化。",[18,117,118,121],{},[22,119,120],{},"记忆管理","：执行三层记忆（Working\u002FLong-term\u002FUser）的读写、压缩、遗忘和类型转换。",[18,123,124,127],{},[22,125,126],{},"检索系统","：混合检索模块，结合用户意图、场景管理与关键词匹配，快速定位相关记忆。",[73,129,131],{"id":130},"支撑层辅助","支撑层（辅助）",[78,133,135,141],{"start":134},6,[18,136,137,140],{},[22,138,139],{},"监控","：跟踪任务积压、处理耗时和记忆库健康状态。",[18,142,143,146],{},[22,144,145],{},"日志记录","：维护全链路记忆操作日志，便于调试和分析。",[11,148,150],{"id":149},"memscheduler-初始化","MemScheduler 初始化",[66,152,153,154,156],{},"在 MemOS 的架构中，",[69,155,5],{}," 是作为服务器组件的一部分在启动时被初始化的。",[73,158,160],{"id":159},"在-server-router-中初始化","在 Server Router 中初始化",[66,162,163,164,167,168,171],{},"在 ",[69,165,166],{},"src\u002Fmemos\u002Fapi\u002Frouters\u002Fserver_router.py"," 中，调度器通过 ",[69,169,170],{},"init_server()"," 函数被自动加载：",[173,174,179],"pre",{"className":175,"code":176,"language":177,"meta":178,"style":178},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from memos.api import handlers\nfrom memos.api.handlers.base_handler import HandlerDependencies\nfrom memos.mem_scheduler.base_scheduler import BaseScheduler\nfrom memos.mem_scheduler.utils.status_tracker import TaskStatusTracker\n\n# ... 其他导入 ...\n\n# 1. 初始化所有服务器组件 (包括 DB, LLM, Memory, Scheduler)\n# init_server() 会读取环境变量并初始化全局单例组件\ncomponents = handlers.init_server()\n\n# Create dependency container for handlers\ndependencies = HandlerDependencies.from_init_server(components)\n\n# Initialize handlers...\n# search_handler = SearchHandler(dependencies)\n# ...\n\n# 2. 从组件字典中获取调度器实例\n# 调度器在 init_server 内部已经被初始化并启动（如果启用了的话）\nmem_scheduler: BaseScheduler = components[\"mem_scheduler\"]\n\n# 3. 用户还可以在components中获取其他调度相关组件 (可选，用于自定义任务处理)\n# redis_client 用于直接操作 Redis 或监控任务状态\nredis_client = components[\"redis_client\"]\n# ...\n","python","",[69,180,181,207,234,255,281,288,294,299,305,311,332,337,343,368,373,379,385,391,396,402,408,438,443,449,455,476],{"__ignoreMap":178},[182,183,186,190,194,198,201,204],"span",{"class":184,"line":185},"line",1,[182,187,189],{"class":188},"s7zQu","from",[182,191,193],{"class":192},"sTEyZ"," memos",[182,195,197],{"class":196},"sMK4o",".",[182,199,200],{"class":192},"api ",[182,202,203],{"class":188},"import",[182,205,206],{"class":192}," handlers\n",[182,208,210,212,214,216,219,221,224,226,229,231],{"class":184,"line":209},2,[182,211,189],{"class":188},[182,213,193],{"class":192},[182,215,197],{"class":196},[182,217,218],{"class":192},"api",[182,220,197],{"class":196},[182,222,223],{"class":192},"handlers",[182,225,197],{"class":196},[182,227,228],{"class":192},"base_handler ",[182,230,203],{"class":188},[182,232,233],{"class":192}," HandlerDependencies\n",[182,235,236,238,240,242,245,247,250,252],{"class":184,"line":109},[182,237,189],{"class":188},[182,239,193],{"class":192},[182,241,197],{"class":196},[182,243,244],{"class":192},"mem_scheduler",[182,246,197],{"class":196},[182,248,249],{"class":192},"base_scheduler ",[182,251,203],{"class":188},[182,253,254],{"class":192}," BaseScheduler\n",[182,256,258,260,262,264,266,268,271,273,276,278],{"class":184,"line":257},4,[182,259,189],{"class":188},[182,261,193],{"class":192},[182,263,197],{"class":196},[182,265,244],{"class":192},[182,267,197],{"class":196},[182,269,270],{"class":192},"utils",[182,272,197],{"class":196},[182,274,275],{"class":192},"status_tracker ",[182,277,203],{"class":188},[182,279,280],{"class":192}," TaskStatusTracker\n",[182,282,284],{"class":184,"line":283},5,[182,285,287],{"emptyLinePlaceholder":286},true,"\n",[182,289,290],{"class":184,"line":134},[182,291,293],{"class":292},"sHwdD","# ... 其他导入 ...\n",[182,295,297],{"class":184,"line":296},7,[182,298,287],{"emptyLinePlaceholder":286},[182,300,302],{"class":184,"line":301},8,[182,303,304],{"class":292},"# 1. 初始化所有服务器组件 (包括 DB, LLM, Memory, Scheduler)\n",[182,306,308],{"class":184,"line":307},9,[182,309,310],{"class":292},"# init_server() 会读取环境变量并初始化全局单例组件\n",[182,312,314,317,320,323,325,329],{"class":184,"line":313},10,[182,315,316],{"class":192},"components ",[182,318,319],{"class":196},"=",[182,321,322],{"class":192}," handlers",[182,324,197],{"class":196},[182,326,328],{"class":327},"s2Zo4","init_server",[182,330,331],{"class":196},"()\n",[182,333,335],{"class":184,"line":334},11,[182,336,287],{"emptyLinePlaceholder":286},[182,338,340],{"class":184,"line":339},12,[182,341,342],{"class":292},"# Create dependency container for handlers\n",[182,344,346,349,351,354,356,359,362,365],{"class":184,"line":345},13,[182,347,348],{"class":192},"dependencies ",[182,350,319],{"class":196},[182,352,353],{"class":192}," HandlerDependencies",[182,355,197],{"class":196},[182,357,358],{"class":327},"from_init_server",[182,360,361],{"class":196},"(",[182,363,364],{"class":327},"components",[182,366,367],{"class":196},")\n",[182,369,371],{"class":184,"line":370},14,[182,372,287],{"emptyLinePlaceholder":286},[182,374,376],{"class":184,"line":375},15,[182,377,378],{"class":292},"# Initialize handlers...\n",[182,380,382],{"class":184,"line":381},16,[182,383,384],{"class":292},"# search_handler = SearchHandler(dependencies)\n",[182,386,388],{"class":184,"line":387},17,[182,389,390],{"class":292},"# ...\n",[182,392,394],{"class":184,"line":393},18,[182,395,287],{"emptyLinePlaceholder":286},[182,397,399],{"class":184,"line":398},19,[182,400,401],{"class":292},"# 2. 从组件字典中获取调度器实例\n",[182,403,405],{"class":184,"line":404},20,[182,406,407],{"class":292},"# 调度器在 init_server 内部已经被初始化并启动（如果启用了的话）\n",[182,409,411,413,416,419,421,424,427,430,433,435],{"class":184,"line":410},21,[182,412,244],{"class":192},[182,414,415],{"class":196},":",[182,417,418],{"class":192}," BaseScheduler ",[182,420,319],{"class":196},[182,422,423],{"class":192}," components",[182,425,426],{"class":196},"[",[182,428,429],{"class":196},"\"",[182,431,244],{"class":432},"sfazB",[182,434,429],{"class":196},[182,436,437],{"class":196},"]\n",[182,439,441],{"class":184,"line":440},22,[182,442,287],{"emptyLinePlaceholder":286},[182,444,446],{"class":184,"line":445},23,[182,447,448],{"class":292},"# 3. 用户还可以在components中获取其他调度相关组件 (可选，用于自定义任务处理)\n",[182,450,452],{"class":184,"line":451},24,[182,453,454],{"class":292},"# redis_client 用于直接操作 Redis 或监控任务状态\n",[182,456,458,461,463,465,467,469,472,474],{"class":184,"line":457},25,[182,459,460],{"class":192},"redis_client ",[182,462,319],{"class":196},[182,464,423],{"class":192},[182,466,426],{"class":196},[182,468,429],{"class":196},[182,470,471],{"class":432},"redis_client",[182,473,429],{"class":196},[182,475,437],{"class":196},[182,477,479],{"class":184,"line":478},26,[182,480,390],{"class":292},[11,482,483],{"id":483},"调度任务与数据模型",[66,485,486],{},"调度器通过消息驱动的方式分发和执行任务。本节介绍支持的任务类型、消息结构和执行日志。",[73,488,489],{"id":489},"消息类型与处理器",[66,491,492,493,496,497,500],{},"调度器通过注册特定的任务标签（Label）与处理器（Handler）来分发和执行任务。以下是当前版本（基于 ",[69,494,495],{},"GeneralScheduler"," 和 ",[69,498,499],{},"OptimizedScheduler","）默认支持的调度任务：",[502,503,504,524],"table",{},[505,506,507],"thead",{},[508,509,510,515,518,521],"tr",{},[511,512,514],"th",{"align":513},"left","消息标签 (Label)",[511,516,517],{"align":513},"对应常量",[511,519,520],{"align":513},"处理器方法",[511,522,523],{"align":513},"描述",[525,526,527,548,568,588,608,632,652,672,692],"tbody",{},[508,528,529,535,540,545],{},[530,531,532],"td",{"align":513},[69,533,534],{},"query",[530,536,537],{"align":513},[69,538,539],{},"QUERY_TASK_LABEL",[530,541,542],{"align":513},[69,543,544],{},"_query_message_consumer",[530,546,547],{"align":513},"处理用户查询，触发意图识别、记忆检索，并将其转换为记忆更新任务。",[508,549,550,555,560,565],{},[530,551,552],{"align":513},[69,553,554],{},"answer",[530,556,557],{"align":513},[69,558,559],{},"ANSWER_TASK_LABEL",[530,561,562],{"align":513},[69,563,564],{},"_answer_message_consumer",[530,566,567],{"align":513},"处理 AI 回复，记录对话日志。",[508,569,570,575,580,585],{},[530,571,572],{"align":513},[69,573,574],{},"mem_update",[530,576,577],{"align":513},[69,578,579],{},"MEM_UPDATE_TASK_LABEL",[530,581,582],{"align":513},[69,583,584],{},"_memory_update_consumer",[530,586,587],{"align":513},"核心任务。执行长时记忆的更新流程，包括提取 Query Keyword、更新 Monitor、检索相关记忆并替换工作记忆（Working Memory）。",[508,589,590,595,600,605],{},[530,591,592],{"align":513},[69,593,594],{},"add",[530,596,597],{"align":513},[69,598,599],{},"ADD_TASK_LABEL",[530,601,602],{"align":513},[69,603,604],{},"_add_message_consumer",[530,606,607],{"align":513},"处理新记忆的添加日志记录（支持本地和云端日志）。",[508,609,610,615,620,625],{},[530,611,612],{"align":513},[69,613,614],{},"mem_read",[530,616,617],{"align":513},[69,618,619],{},"MEM_READ_TASK_LABEL",[530,621,622],{"align":513},[69,623,624],{},"_mem_read_message_consumer",[530,626,627,628,631],{"align":513},"使用 ",[69,629,630],{},"MemReader"," 深度处理和导入外部记忆内容。",[508,633,634,639,644,649],{},[530,635,636],{"align":513},[69,637,638],{},"mem_organize",[530,640,641],{"align":513},[69,642,643],{},"MEM_ORGANIZE_TASK_LABEL",[530,645,646],{"align":513},[69,647,648],{},"_mem_reorganize_message_consumer",[530,650,651],{"align":513},"触发记忆的重组和合并（Merge）操作。",[508,653,654,659,664,669],{},[530,655,656],{"align":513},[69,657,658],{},"pref_add",[530,660,661],{"align":513},[69,662,663],{},"PREF_ADD_TASK_LABEL",[530,665,666],{"align":513},[69,667,668],{},"_pref_add_message_consumer",[530,670,671],{"align":513},"处理用户偏好记忆（Preference Memory）的提取和添加。",[508,673,674,679,684,689],{},[530,675,676],{"align":513},[69,677,678],{},"mem_feedback",[530,680,681],{"align":513},[69,682,683],{},"MEM_FEEDBACK_TASK_LABEL",[530,685,686],{"align":513},[69,687,688],{},"_mem_feedback_message_consumer",[530,690,691],{"align":513},"处理用户反馈，用于修正记忆或强化偏好。",[508,693,694,699,704,709],{},[530,695,696],{"align":513},[69,697,698],{},"api_mix_search",[530,700,701],{"align":513},[69,702,703],{},"API_MIX_SEARCH_TASK_LABEL",[530,705,706],{"align":513},[69,707,708],{},"_api_mix_search_message_consumer",[530,710,711],{"align":513},"(OptimizedScheduler 特有) 执行异步混合搜索任务，结合快速检索与精细检索。",[73,713,715],{"id":714},"消息数据结构-schedulemessageitem","消息数据结构 (ScheduleMessageItem)",[66,717,718,719,722],{},"调度器使用统一的 ",[69,720,721],{},"ScheduleMessageItem"," 结构在队列中传递消息。",[724,725,726],"blockquote",{},[66,727,728,731,732,735,736,739],{},[22,729,730],{},"注意","：",[69,733,734],{},"mem_cube"," 对象本身不直接包含在消息模型中，而是通过 ",[69,737,738],{},"mem_cube_id"," 在运行时由调度器解析。",[502,741,742,757],{},[505,743,744],{},[508,745,746,749,752,754],{},[511,747,748],{"align":513},"字段",[511,750,751],{"align":513},"类型",[511,753,523],{"align":513},[511,755,756],{"align":513},"默认值\u002F备注",[525,758,759,777,794,809,830,846,864,883,899,917,936,955],{},[508,760,761,766,771,774],{},[530,762,763],{"align":513},[69,764,765],{},"item_id",[530,767,768],{"align":513},[69,769,770],{},"str",[530,772,773],{"align":513},"消息唯一标识符 (UUID)",[530,775,776],{"align":513},"自动生成",[508,778,779,784,788,791],{},[530,780,781],{"align":513},[69,782,783],{},"user_id",[530,785,786],{"align":513},[69,787,770],{},[530,789,790],{"align":513},"关联的用户 ID",[530,792,793],{"align":513},"(必需)",[508,795,796,800,804,807],{},[530,797,798],{"align":513},[69,799,738],{},[530,801,802],{"align":513},[69,803,770],{},[530,805,806],{"align":513},"关联的 Memory Cube ID",[530,808,793],{"align":513},[508,810,811,816,820,828],{},[530,812,813],{"align":513},[69,814,815],{},"label",[530,817,818],{"align":513},[69,819,770],{},[530,821,822,823,89,825,827],{"align":513},"任务标签 (如 ",[69,824,534],{},[69,826,574],{},")",[530,829,793],{"align":513},[508,831,832,837,841,844],{},[530,833,834],{"align":513},[69,835,836],{},"content",[530,838,839],{"align":513},[69,840,770],{},[530,842,843],{"align":513},"消息载荷 (通常为 JSON 字符串或文本)",[530,845,793],{"align":513},[508,847,848,853,858,861],{},[530,849,850],{"align":513},[69,851,852],{},"timestamp",[530,854,855],{"align":513},[69,856,857],{},"datetime",[530,859,860],{"align":513},"消息提交时间",[530,862,863],{"align":513},"自动生成 (UTC now)",[508,865,866,871,875,878],{},[530,867,868],{"align":513},[69,869,870],{},"session_id",[530,872,873],{"align":513},[69,874,770],{},[530,876,877],{"align":513},"会话 ID，用于上下文隔离",[530,879,880],{"align":513},[69,881,882],{},"\"\"",[508,884,885,890,894,897],{},[530,886,887],{"align":513},[69,888,889],{},"trace_id",[530,891,892],{"align":513},[69,893,770],{},[530,895,896],{"align":513},"链路追踪 ID，用于全链路日志关联",[530,898,776],{"align":513},[508,900,901,906,910,913],{},[530,902,903],{"align":513},[69,904,905],{},"user_name",[530,907,908],{"align":513},[69,909,770],{},[530,911,912],{"align":513},"用户显示名称",[530,914,915],{"align":513},[69,916,882],{},[508,918,919,924,928,931],{},[530,920,921],{"align":513},[69,922,923],{},"task_id",[530,925,926],{"align":513},[69,927,770],{},[530,929,930],{"align":513},"业务级任务 ID (用于关联多个消息)",[530,932,933],{"align":513},[69,934,935],{},"None",[508,937,938,943,948,951],{},[530,939,940],{"align":513},[69,941,942],{},"info",[530,944,945],{"align":513},[69,946,947],{},"dict",[530,949,950],{"align":513},"额外的自定义上下文信息",[530,952,953],{"align":513},[69,954,935],{},[508,956,957,962,966,969],{},[530,958,959],{"align":513},[69,960,961],{},"stream_key",[530,963,964],{"align":513},[69,965,770],{},[530,967,968],{"align":513},"(内部使用) Redis Stream 的键名",[530,970,971],{"align":513},[69,972,882],{},[73,974,976],{"id":975},"执行日志结构-schedulelogforwebitem","执行日志结构 (ScheduleLogForWebItem)",[66,978,979],{},"调度器会生成用于前端展示或持久化存储的结构化日志消息。",[502,981,982,995],{},[505,983,984],{},[508,985,986,988,990,992],{},[511,987,748],{"align":513},[511,989,751],{"align":513},[511,991,523],{"align":513},[511,993,994],{"align":513},"备注",[525,996,997,1012,1028,1043,1058,1079,1095,1118,1137,1155,1172,1194,1209,1227],{},[508,998,999,1003,1007,1010],{},[530,1000,1001],{"align":513},[69,1002,765],{},[530,1004,1005],{"align":513},[69,1006,770],{},[530,1008,1009],{"align":513},"日志条目唯一标识符",[530,1011,776],{"align":513},[508,1013,1014,1018,1022,1025],{},[530,1015,1016],{"align":513},[69,1017,923],{},[530,1019,1020],{"align":513},[69,1021,770],{},[530,1023,1024],{"align":513},"关联的父任务 ID",[530,1026,1027],{"align":513},"可选",[508,1029,1030,1034,1038,1041],{},[530,1031,1032],{"align":513},[69,1033,783],{},[530,1035,1036],{"align":513},[69,1037,770],{},[530,1039,1040],{"align":513},"用户 ID",[530,1042,793],{"align":513},[508,1044,1045,1049,1053,1056],{},[530,1046,1047],{"align":513},[69,1048,738],{},[530,1050,1051],{"align":513},[69,1052,770],{},[530,1054,1055],{"align":513},"Memory Cube ID",[530,1057,793],{"align":513},[508,1059,1060,1064,1068,1077],{},[530,1061,1062],{"align":513},[69,1063,815],{},[530,1065,1066],{"align":513},[69,1067,770],{},[530,1069,1070,1071,89,1074,827],{"align":513},"日志类别 (如 ",[69,1072,1073],{},"addMessage",[69,1075,1076],{},"addMemory",[530,1078,793],{"align":513},[508,1080,1081,1086,1090,1093],{},[530,1082,1083],{"align":513},[69,1084,1085],{},"log_content",[530,1087,1088],{"align":513},[69,1089,770],{},[530,1091,1092],{"align":513},"简短的日志描述文本",[530,1094,793],{"align":513},[508,1096,1097,1102,1106,1109],{},[530,1098,1099],{"align":513},[69,1100,1101],{},"from_memory_type",[530,1103,1104],{"align":513},[69,1105,770],{},[530,1107,1108],{"align":513},"源记忆区域",[530,1110,1111,1112,89,1115],{"align":513},"如 ",[69,1113,1114],{},"UserInput",[69,1116,1117],{},"LongTermMemory",[508,1119,1120,1125,1129,1132],{},[530,1121,1122],{"align":513},[69,1123,1124],{},"to_memory_type",[530,1126,1127],{"align":513},[69,1128,770],{},[530,1130,1131],{"align":513},"目标记忆区域",[530,1133,1111,1134],{"align":513},[69,1135,1136],{},"WorkingMemory",[508,1138,1139,1144,1149,1152],{},[530,1140,1141],{"align":513},[69,1142,1143],{},"memcube_log_content",[530,1145,1146],{"align":513},[69,1147,1148],{},"list[dict]",[530,1150,1151],{"align":513},"结构化的详细内容",[530,1153,1154],{"align":513},"包含具体的记忆文本、引用 ID 等",[508,1156,1157,1162,1166,1169],{},[530,1158,1159],{"align":513},[69,1160,1161],{},"metadata",[530,1163,1164],{"align":513},[69,1165,1148],{},[530,1167,1168],{"align":513},"记忆项元数据",[530,1170,1171],{"align":513},"包含置信度、状态、标签等",[508,1173,1174,1179,1183,1186],{},[530,1175,1176],{"align":513},[69,1177,1178],{},"status",[530,1180,1181],{"align":513},[69,1182,770],{},[530,1184,1185],{"align":513},"任务状态",[530,1187,1111,1188,89,1191],{"align":513},[69,1189,1190],{},"completed",[69,1192,1193],{},"failed",[508,1195,1196,1200,1204,1207],{},[530,1197,1198],{"align":513},[69,1199,852],{},[530,1201,1202],{"align":513},[69,1203,857],{},[530,1205,1206],{"align":513},"日志创建时间",[530,1208,776],{"align":513},[508,1210,1211,1216,1221,1224],{},[530,1212,1213],{"align":513},[69,1214,1215],{},"current_memory_sizes",[530,1217,1218],{"align":513},[69,1219,1220],{},"MemorySizes",[530,1222,1223],{"align":513},"当前各区域记忆数量快照",[530,1225,1226],{"align":513},"用于监控面板展示",[508,1228,1229,1234,1239,1242],{},[530,1230,1231],{"align":513},[69,1232,1233],{},"memory_capacities",[530,1235,1236],{"align":513},[69,1237,1238],{},"MemoryCapacities",[530,1240,1241],{"align":513},"各区域记忆容量限制",[530,1243,1226],{"align":513},[11,1245,1246],{"id":1246},"调度功能示例",[73,1248,1250],{"id":1249},"_1-消息处理与自定义-handler","1. 消息处理与自定义 Handler",[66,1252,1253,1254,1257],{},"调度器最强大的功能是支持注册自定义的消息处理器（Handler）。你可以定义特定类型的消息（如 ",[69,1255,1256],{},"MY_CUSTOM_TASK","），并编写函数来处理它。",[173,1259,1261],{"className":175,"code":1260,"language":177,"meta":178,"style":178},"import uuid\nfrom datetime import datetime\n\n# 1. 导入必要的类型定义和调度器实例\n# 注意：mem_scheduler 需要从 server_router 导入，因为它是一个全局单例\nfrom memos.api.routers.server_router import mem_scheduler\nfrom memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem\n\n# 定义一个自定义的任务标签\nMY_TASK_LABEL = \"MY_CUSTOM_TASK\"\n\n\n# 定义处理器函数\ndef my_task_handler(messages: list[ScheduleMessageItem]):\n    \"\"\"\n    处理自定义任务的函数\n    \"\"\"\n    for msg in messages:\n        print(f\"⚡️ [Handler] 收到任务: {msg.item_id}\")\n        print(f\"📦 内容: {msg.content}\")\n        # 在这里执行你的业务逻辑，例如：调用 LLM、写数据库、触发其他任务等\n\n\n# 2. 注册处理器到调度器\n# 这一步将您的自定义逻辑挂载到调度系统中\nmem_scheduler.register_handlers({\n    MY_TASK_LABEL: my_task_handler\n})\n\n# 3. 提交任务\ntask = ScheduleMessageItem(\n    item_id=str(uuid.uuid4()),\n    user_id=\"user_123\",\n    mem_cube_id=\"cube_001\",\n    label=MY_TASK_LABEL,\n    content=\"这是一条测试消息\",\n    timestamp=datetime.now()\n)\n\n# 如果调度器未启动，这里会直接放入队列等待处理（如果是 Redis 队列）\n# 或者在本地队列模式下可能需要先调用 mem_scheduler.start()\nmem_scheduler.submit_messages([task])\n\nprint(f\"Task submitted: {task.item_id}\")\n\n# 防止调度器主进程提前退出\ntime.sleep(10)\n",[69,1262,1263,1270,1282,1286,1291,1296,1321,1346,1350,1355,1370,1374,1378,1383,1410,1415,1420,1424,1441,1473,1498,1503,1507,1511,1516,1521,1533,1544,1550,1555,1561,1575,1599,1617,1634,1647,1664,1681,1686,1691,1697,1703,1722,1727,1754,1759,1765],{"__ignoreMap":178},[182,1264,1265,1267],{"class":184,"line":185},[182,1266,203],{"class":188},[182,1268,1269],{"class":192}," uuid\n",[182,1271,1272,1274,1277,1279],{"class":184,"line":209},[182,1273,189],{"class":188},[182,1275,1276],{"class":192}," datetime ",[182,1278,203],{"class":188},[182,1280,1281],{"class":192}," datetime\n",[182,1283,1284],{"class":184,"line":109},[182,1285,287],{"emptyLinePlaceholder":286},[182,1287,1288],{"class":184,"line":257},[182,1289,1290],{"class":292},"# 1. 导入必要的类型定义和调度器实例\n",[182,1292,1293],{"class":184,"line":283},[182,1294,1295],{"class":292},"# 注意：mem_scheduler 需要从 server_router 导入，因为它是一个全局单例\n",[182,1297,1298,1300,1302,1304,1306,1308,1311,1313,1316,1318],{"class":184,"line":134},[182,1299,189],{"class":188},[182,1301,193],{"class":192},[182,1303,197],{"class":196},[182,1305,218],{"class":192},[182,1307,197],{"class":196},[182,1309,1310],{"class":192},"routers",[182,1312,197],{"class":196},[182,1314,1315],{"class":192},"server_router ",[182,1317,203],{"class":188},[182,1319,1320],{"class":192}," mem_scheduler\n",[182,1322,1323,1325,1327,1329,1331,1333,1336,1338,1341,1343],{"class":184,"line":296},[182,1324,189],{"class":188},[182,1326,193],{"class":192},[182,1328,197],{"class":196},[182,1330,244],{"class":192},[182,1332,197],{"class":196},[182,1334,1335],{"class":192},"schemas",[182,1337,197],{"class":196},[182,1339,1340],{"class":192},"message_schemas ",[182,1342,203],{"class":188},[182,1344,1345],{"class":192}," ScheduleMessageItem\n",[182,1347,1348],{"class":184,"line":301},[182,1349,287],{"emptyLinePlaceholder":286},[182,1351,1352],{"class":184,"line":307},[182,1353,1354],{"class":292},"# 定义一个自定义的任务标签\n",[182,1356,1357,1360,1362,1365,1367],{"class":184,"line":313},[182,1358,1359],{"class":192},"MY_TASK_LABEL ",[182,1361,319],{"class":196},[182,1363,1364],{"class":196}," \"",[182,1366,1256],{"class":432},[182,1368,1369],{"class":196},"\"\n",[182,1371,1372],{"class":184,"line":334},[182,1373,287],{"emptyLinePlaceholder":286},[182,1375,1376],{"class":184,"line":339},[182,1377,287],{"emptyLinePlaceholder":286},[182,1379,1380],{"class":184,"line":345},[182,1381,1382],{"class":292},"# 定义处理器函数\n",[182,1384,1385,1389,1392,1394,1398,1400,1403,1405,1407],{"class":184,"line":370},[182,1386,1388],{"class":1387},"spNyl","def",[182,1390,1391],{"class":327}," my_task_handler",[182,1393,361],{"class":196},[182,1395,1397],{"class":1396},"sHdIc","messages",[182,1399,415],{"class":196},[182,1401,1402],{"class":192}," list",[182,1404,426],{"class":196},[182,1406,721],{"class":192},[182,1408,1409],{"class":196},"]):\n",[182,1411,1412],{"class":184,"line":375},[182,1413,1414],{"class":188},"    \"\"\"\n",[182,1416,1417],{"class":184,"line":381},[182,1418,1419],{"class":292},"    处理自定义任务的函数\n",[182,1421,1422],{"class":184,"line":387},[182,1423,1414],{"class":188},[182,1425,1426,1429,1432,1435,1438],{"class":184,"line":393},[182,1427,1428],{"class":188},"    for",[182,1430,1431],{"class":192}," msg ",[182,1433,1434],{"class":188},"in",[182,1436,1437],{"class":192}," messages",[182,1439,1440],{"class":196},":\n",[182,1442,1443,1446,1448,1451,1454,1458,1461,1463,1466,1469,1471],{"class":184,"line":398},[182,1444,1445],{"class":327},"        print",[182,1447,361],{"class":196},[182,1449,1450],{"class":1387},"f",[182,1452,1453],{"class":432},"\"⚡️ [Handler] 收到任务: ",[182,1455,1457],{"class":1456},"sbssI","{",[182,1459,1460],{"class":327},"msg",[182,1462,197],{"class":196},[182,1464,765],{"class":1465},"swJcz",[182,1467,1468],{"class":1456},"}",[182,1470,429],{"class":432},[182,1472,367],{"class":196},[182,1474,1475,1477,1479,1481,1484,1486,1488,1490,1492,1494,1496],{"class":184,"line":404},[182,1476,1445],{"class":327},[182,1478,361],{"class":196},[182,1480,1450],{"class":1387},[182,1482,1483],{"class":432},"\"📦 内容: ",[182,1485,1457],{"class":1456},[182,1487,1460],{"class":327},[182,1489,197],{"class":196},[182,1491,836],{"class":1465},[182,1493,1468],{"class":1456},[182,1495,429],{"class":432},[182,1497,367],{"class":196},[182,1499,1500],{"class":184,"line":410},[182,1501,1502],{"class":292},"        # 在这里执行你的业务逻辑，例如：调用 LLM、写数据库、触发其他任务等\n",[182,1504,1505],{"class":184,"line":440},[182,1506,287],{"emptyLinePlaceholder":286},[182,1508,1509],{"class":184,"line":445},[182,1510,287],{"emptyLinePlaceholder":286},[182,1512,1513],{"class":184,"line":451},[182,1514,1515],{"class":292},"# 2. 注册处理器到调度器\n",[182,1517,1518],{"class":184,"line":457},[182,1519,1520],{"class":292},"# 这一步将您的自定义逻辑挂载到调度系统中\n",[182,1522,1523,1525,1527,1530],{"class":184,"line":478},[182,1524,244],{"class":192},[182,1526,197],{"class":196},[182,1528,1529],{"class":327},"register_handlers",[182,1531,1532],{"class":196},"({\n",[182,1534,1536,1539,1541],{"class":184,"line":1535},27,[182,1537,1538],{"class":327},"    MY_TASK_LABEL",[182,1540,415],{"class":196},[182,1542,1543],{"class":327}," my_task_handler\n",[182,1545,1547],{"class":184,"line":1546},28,[182,1548,1549],{"class":196},"})\n",[182,1551,1553],{"class":184,"line":1552},29,[182,1554,287],{"emptyLinePlaceholder":286},[182,1556,1558],{"class":184,"line":1557},30,[182,1559,1560],{"class":292},"# 3. 提交任务\n",[182,1562,1564,1567,1569,1572],{"class":184,"line":1563},31,[182,1565,1566],{"class":192},"task ",[182,1568,319],{"class":196},[182,1570,1571],{"class":327}," ScheduleMessageItem",[182,1573,1574],{"class":196},"(\n",[182,1576,1578,1581,1583,1586,1588,1591,1593,1596],{"class":184,"line":1577},32,[182,1579,1580],{"class":1396},"    item_id",[182,1582,319],{"class":196},[182,1584,770],{"class":1585},"sBMFI",[182,1587,361],{"class":196},[182,1589,1590],{"class":327},"uuid",[182,1592,197],{"class":196},[182,1594,1595],{"class":327},"uuid4",[182,1597,1598],{"class":196},"()),\n",[182,1600,1602,1605,1607,1609,1612,1614],{"class":184,"line":1601},33,[182,1603,1604],{"class":1396},"    user_id",[182,1606,319],{"class":196},[182,1608,429],{"class":196},[182,1610,1611],{"class":432},"user_123",[182,1613,429],{"class":196},[182,1615,1616],{"class":196},",\n",[182,1618,1620,1623,1625,1627,1630,1632],{"class":184,"line":1619},34,[182,1621,1622],{"class":1396},"    mem_cube_id",[182,1624,319],{"class":196},[182,1626,429],{"class":196},[182,1628,1629],{"class":432},"cube_001",[182,1631,429],{"class":196},[182,1633,1616],{"class":196},[182,1635,1637,1640,1642,1645],{"class":184,"line":1636},35,[182,1638,1639],{"class":1396},"    label",[182,1641,319],{"class":196},[182,1643,1644],{"class":327},"MY_TASK_LABEL",[182,1646,1616],{"class":196},[182,1648,1650,1653,1655,1657,1660,1662],{"class":184,"line":1649},36,[182,1651,1652],{"class":1396},"    content",[182,1654,319],{"class":196},[182,1656,429],{"class":196},[182,1658,1659],{"class":432},"这是一条测试消息",[182,1661,429],{"class":196},[182,1663,1616],{"class":196},[182,1665,1667,1670,1672,1674,1676,1679],{"class":184,"line":1666},37,[182,1668,1669],{"class":1396},"    timestamp",[182,1671,319],{"class":196},[182,1673,857],{"class":327},[182,1675,197],{"class":196},[182,1677,1678],{"class":327},"now",[182,1680,331],{"class":196},[182,1682,1684],{"class":184,"line":1683},38,[182,1685,367],{"class":196},[182,1687,1689],{"class":184,"line":1688},39,[182,1690,287],{"emptyLinePlaceholder":286},[182,1692,1694],{"class":184,"line":1693},40,[182,1695,1696],{"class":292},"# 如果调度器未启动，这里会直接放入队列等待处理（如果是 Redis 队列）\n",[182,1698,1700],{"class":184,"line":1699},41,[182,1701,1702],{"class":292},"# 或者在本地队列模式下可能需要先调用 mem_scheduler.start()\n",[182,1704,1706,1708,1710,1713,1716,1719],{"class":184,"line":1705},42,[182,1707,244],{"class":192},[182,1709,197],{"class":196},[182,1711,1712],{"class":327},"submit_messages",[182,1714,1715],{"class":196},"([",[182,1717,1718],{"class":327},"task",[182,1720,1721],{"class":196},"])\n",[182,1723,1725],{"class":184,"line":1724},43,[182,1726,287],{"emptyLinePlaceholder":286},[182,1728,1730,1733,1735,1737,1740,1742,1744,1746,1748,1750,1752],{"class":184,"line":1729},44,[182,1731,1732],{"class":327},"print",[182,1734,361],{"class":196},[182,1736,1450],{"class":1387},[182,1738,1739],{"class":432},"\"Task submitted: ",[182,1741,1457],{"class":1456},[182,1743,1718],{"class":327},[182,1745,197],{"class":196},[182,1747,765],{"class":1465},[182,1749,1468],{"class":1456},[182,1751,429],{"class":432},[182,1753,367],{"class":196},[182,1755,1757],{"class":184,"line":1756},45,[182,1758,287],{"emptyLinePlaceholder":286},[182,1760,1762],{"class":184,"line":1761},46,[182,1763,1764],{"class":292},"# 防止调度器主进程提前退出\n",[182,1766,1768,1771,1773,1776,1778,1781],{"class":184,"line":1767},47,[182,1769,1770],{"class":192},"time",[182,1772,197],{"class":196},[182,1774,1775],{"class":327},"sleep",[182,1777,361],{"class":196},[182,1779,1780],{"class":1456},"10",[182,1782,367],{"class":196},[73,1784,1786],{"id":1785},"_2-redis-队列-vs-本地队列","2. Redis 队列 vs 本地队列",[15,1788,1789,1816],{},[18,1790,1791,731,1794],{},[22,1792,1793],{},"本地队列 (Local Queue)",[15,1795,1796,1802,1808],{},[18,1797,1798,1801],{},[22,1799,1800],{},"适用场景","：单元测试、简单的单机脚本。",[18,1803,1804,1807],{},[22,1805,1806],{},"特点","：速度快，但进程重启后数据丢失，不支持多进程\u002F多实例共享。",[18,1809,1810,731,1813],{},[22,1811,1812],{},"配置",[69,1814,1815],{},"MOS_SCHEDULER_USE_REDIS_QUEUE=false",[18,1817,1818,731,1821],{},[22,1819,1820],{},"Redis 队列 (Redis Stream)",[15,1822,1823,1828,1833,1840],{},[18,1824,1825,1827],{},[22,1826,1800],{},"：生产环境、分布式部署。",[18,1829,1830,1832],{},[22,1831,1806],{},"：数据持久化，支持消费者组（Consumer Group），允许多个调度器实例共同处理任务（负载均衡）。",[18,1834,1835,731,1837],{},[22,1836,1812],{},[69,1838,1839],{},"MOS_SCHEDULER_USE_REDIS_QUEUE=true",[18,1841,1842,1845,1846,1849],{},[22,1843,1844],{},"调试","：可以使用 ",[69,1847,1848],{},"show_redis_status.py"," 脚本查看队列堆积情况。",[11,1851,1852],{"id":1852},"综合应用场景",[73,1854,1856],{"id":1855},"场景-1-基础对话流与记忆更新","场景 1: 基础对话流与记忆更新",[66,1858,1859],{},"以下是一个完善的示例，展示了如何初始化环境、注册自定义逻辑、模拟对话流以及触发记忆更新。",[173,1861,1863],{"className":175,"code":1862,"language":177,"meta":178,"style":178},"import asyncio\nimport json\nimport os\nimport sys\nimport time\nfrom pathlib import Path\n\n# --- 环境准备 ---\n# 1. 设置项目根目录到 sys.path，确保能导入 memos 模块\nFILE_PATH = Path(__file__).absolute()\nBASE_DIR = FILE_PATH.parent.parent.parent\nsys.path.insert(0, str(BASE_DIR))\n\n# 2. 设置必要的环境变量 (模拟 .env 配置)\nos.environ[\"ENABLE_CHAT_API\"] = \"true\"\nos.environ[\"MOS_ENABLE_SCHEDULER\"] = \"true\"\n# 决定使用 Redis 还是 Local 队列\nos.environ[\"MOS_SCHEDULER_USE_REDIS_QUEUE\"] = \"false\" \n\n# --- 导入组件 ---\n# 注意：导入 server_router 会触发组件初始化，确保环境变量在此之前设置好\nfrom memos.api.product_models import APIADDRequest, ChatPlaygroundRequest\nfrom memos.api.routers.server_router import (\n    add_handler,\n    chat_stream_playground,\n    mem_scheduler,  # 这里的 mem_scheduler 已经是初始化好的单例\n)\nfrom memos.log import get_logger\nfrom memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem\nfrom memos.mem_scheduler.schemas.task_schemas import (\n    MEM_UPDATE_TASK_LABEL,\n    QUERY_TASK_LABEL,\n)\n\nlogger = get_logger(__name__)\n\n# 全局变量用于演示记忆检索结果\nworking_memories = []\n\n# --- 自定义处理器 ---\n\ndef custom_query_handler(messages: list[ScheduleMessageItem]):\n    \"\"\"\n    处理用户查询消息：\n    1. 打印查询内容\n    2. 将消息转换为 MEM_UPDATE 任务，触发记忆检索\u002F更新流程\n    \"\"\"\n    for msg in messages:\n        print(f\"\\n[Scheduler 🟢] 收到用户查询: {msg.content}\")\n        \n        # 复制消息并将标签改为 MEM_UPDATE，这是一种常见的“任务链”模式\n        new_msg = msg.model_copy(update={\"label\": MEM_UPDATE_TASK_LABEL})\n        \n        # 提交新任务回调度器\n        mem_scheduler.submit_messages([new_msg])\n\n\ndef custom_mem_update_handler(messages: list[ScheduleMessageItem]):\n    \"\"\"\n    处理记忆更新任务：\n    1. 使用检索器 (Retriever) 查找相关记忆\n    2. 更新全局的工作记忆列表\n    \"\"\"\n    global working_memories\n    search_args = {}\n    top_k = 2\n    \n    for msg in messages:\n        print(f\"[Scheduler 🔵] 正在为查询检索记忆...\")\n        # 调用核心检索功能\n        results = mem_scheduler.retriever.search(\n            query=msg.content,\n            user_id=msg.user_id,\n            mem_cube_id=msg.mem_cube_id,\n            mem_cube=mem_scheduler.current_mem_cube,\n            top_k=top_k,\n            method=mem_scheduler.search_method,\n            search_args=search_args,\n        )\n        \n        # 模拟工作记忆的更新\n        working_memories.extend(results)\n        working_memories = working_memories[-5:] # 保持最新的5条\n        \n        for mem in results:\n            # 打印检索到的记忆片段\n            print(f\"  ↳ [Memory Found]: {mem.memory[:50]}...\")\n\n# --- 模拟业务数据 ---\n\ndef get_mock_data():\n    \"\"\"生成模拟对话数据\"\"\"\n    conversations = [\n        {\"role\": \"user\", \"content\": \"I just adopted a golden retriever puppy named Max.\"},\n        {\"role\": \"assistant\", \"content\": \"That's exciting! Max is a great name.\"},\n        {\"role\": \"user\", \"content\": \"He loves peanut butter treats but I am allergic to nuts.\"},\n        {\"role\": \"assistant\", \"content\": \"Noted. Peanut butter for Max, no nuts for you.\"},\n    ]\n    \n    questions = [\n        {\"question\": \"What is my dog's name?\", \"category\": \"Pet\"},\n        {\"question\": \"What am I allergic to?\", \"category\": \"Allergy\"},\n    ]\n    return conversations, questions\n\n# --- 主流程 ---\n\nasync def run_demo():\n    print(\"==== MemScheduler Demo Start ====\")\n    conversations, questions = get_mock_data()\n\n    user_id = \"demo_user_001\"\n    mem_cube_id = \"cube_demo_001\"\n\n    print(f\"1. 初始化用户记忆库 ({user_id})...\")\n    # 使用 API Handler 添加初始记忆 (同步模式)\n    add_req = APIADDRequest(\n        user_id=user_id,\n        writable_cube_ids=[mem_cube_id],\n        messages=conversations,\n        async_mode=\"sync\", \n    )\n    add_handler.handle_add_memories(add_req)\n    print(\"   记忆添加完成。\")\n\n    print(\"\\n2. 开始对话测试 (并在后台触发调度任务)...\")\n    for item in questions:\n        query = item[\"question\"]\n        print(f\"\\n>> User: {query}\")\n\n        # 发起聊天请求\n        chat_req = ChatPlaygroundRequest(\n            user_id=user_id,\n            query=query,\n            readable_cube_ids=[mem_cube_id],\n            writable_cube_ids=[mem_cube_id],\n        )\n        \n        # 获取流式响应\n        response = chat_stream_playground(chat_req)\n        \n        # 处理流式输出 (简化版)\n        full_answer = \"\"\n        buffer = \"\"\n        async for chunk in response.body_iterator:\n            if isinstance(chunk, bytes):\n                chunk = chunk.decode(\"utf-8\")\n            buffer += chunk\n            while \"\\n\\n\" in buffer:\n                msg, buffer = buffer.split(\"\\n\\n\", 1)\n                for line in msg.split(\"\\n\"):\n                    if line.startswith(\"data: \"):\n                        try:\n                            data = json.loads(line[6:])\n                            if data.get(\"type\") == \"text\":\n                                full_answer += data[\"data\"]\n                        except: pass\n                        \n        print(f\">> AI: {full_answer}\")\n        \n        # 等待一小会儿让后台调度器处理任务并打印日志\n        await asyncio.sleep(1)\n\nif __name__ == \"__main__\":\n    # 1. 注册我们的自定义 Handler\n    # 这会覆盖或添加到默认的调度逻辑中\n    mem_scheduler.register_handlers(\n        {\n            QUERY_TASK_LABEL: custom_query_handler,\n            MEM_UPDATE_TASK_LABEL: custom_mem_update_handler,\n        }\n    )\n    \n    # 2. 确保调度器已启动\n    if not mem_scheduler._running:\n        mem_scheduler.start()\n\n    try:\n        asyncio.run(run_demo())\n    except KeyboardInterrupt:\n        pass\n    finally:\n        # 防止调度器主进程提前退出\n        time.sleep(10)\n\n        print(\"\\n==== 停止调度器 ====\")\n        mem_scheduler.stop()\n",[69,1864,1865,1872,1879,1886,1893,1900,1912,1916,1921,1926,1949,1973,2007,2011,2016,2048,2075,2080,2111,2115,2120,2125,2150,2173,2180,2187,2197,2201,2217,2239,2262,2269,2276,2280,2284,2301,2305,2310,2320,2324,2329,2333,2354,2358,2363,2368,2373,2377,2390,2421,2427,2433,2470,2475,2481,2498,2503,2508,2530,2535,2541,2547,2553,2558,2567,2578,2589,2595,2608,2622,2628,2651,2667,2683,2699,2716,2729,2746,2759,2765,2770,2776,2794,2817,2822,2838,2844,2882,2887,2893,2898,2909,2921,2932,2974,3013,3051,3089,3095,3100,3110,3151,3190,3195,3209,3214,3220,3225,3239,3256,3273,3278,3293,3308,3313,3336,3342,3354,3366,3380,3393,3412,3418,3435,3451,3456,3474,3489,3510,3536,3541,3547,3560,3571,3582,3594,3606,3611,3616,3622,3640,3645,3651,3662,3672,3696,3718,3745,3757,3778,3813,3840,3865,3873,3901,3938,3959,3970,3976,3999,4004,4010,4030,4035,4056,4062,4068,4079,4085,4097,4109,4115,4120,4125,4131,4149,4161,4166,4174,4193,4204,4210,4218,4224,4240,4245,4263],{"__ignoreMap":178},[182,1866,1867,1869],{"class":184,"line":185},[182,1868,203],{"class":188},[182,1870,1871],{"class":192}," asyncio\n",[182,1873,1874,1876],{"class":184,"line":209},[182,1875,203],{"class":188},[182,1877,1878],{"class":192}," json\n",[182,1880,1881,1883],{"class":184,"line":109},[182,1882,203],{"class":188},[182,1884,1885],{"class":192}," os\n",[182,1887,1888,1890],{"class":184,"line":257},[182,1889,203],{"class":188},[182,1891,1892],{"class":192}," sys\n",[182,1894,1895,1897],{"class":184,"line":283},[182,1896,203],{"class":188},[182,1898,1899],{"class":192}," time\n",[182,1901,1902,1904,1907,1909],{"class":184,"line":134},[182,1903,189],{"class":188},[182,1905,1906],{"class":192}," pathlib ",[182,1908,203],{"class":188},[182,1910,1911],{"class":192}," Path\n",[182,1913,1914],{"class":184,"line":296},[182,1915,287],{"emptyLinePlaceholder":286},[182,1917,1918],{"class":184,"line":301},[182,1919,1920],{"class":292},"# --- 环境准备 ---\n",[182,1922,1923],{"class":184,"line":307},[182,1924,1925],{"class":292},"# 1. 设置项目根目录到 sys.path，确保能导入 memos 模块\n",[182,1927,1928,1931,1933,1936,1938,1941,1944,1947],{"class":184,"line":313},[182,1929,1930],{"class":192},"FILE_PATH ",[182,1932,319],{"class":196},[182,1934,1935],{"class":327}," Path",[182,1937,361],{"class":196},[182,1939,1940],{"class":192},"__file__",[182,1942,1943],{"class":196},").",[182,1945,1946],{"class":327},"absolute",[182,1948,331],{"class":196},[182,1950,1951,1954,1956,1959,1961,1964,1966,1968,1970],{"class":184,"line":334},[182,1952,1953],{"class":192},"BASE_DIR ",[182,1955,319],{"class":196},[182,1957,1958],{"class":192}," FILE_PATH",[182,1960,197],{"class":196},[182,1962,1963],{"class":1465},"parent",[182,1965,197],{"class":196},[182,1967,1963],{"class":1465},[182,1969,197],{"class":196},[182,1971,1972],{"class":1465},"parent\n",[182,1974,1975,1978,1980,1983,1985,1988,1990,1993,1996,1999,2001,2004],{"class":184,"line":339},[182,1976,1977],{"class":192},"sys",[182,1979,197],{"class":196},[182,1981,1982],{"class":1465},"path",[182,1984,197],{"class":196},[182,1986,1987],{"class":327},"insert",[182,1989,361],{"class":196},[182,1991,1992],{"class":1456},"0",[182,1994,1995],{"class":196},",",[182,1997,1998],{"class":1585}," str",[182,2000,361],{"class":196},[182,2002,2003],{"class":327},"BASE_DIR",[182,2005,2006],{"class":196},"))\n",[182,2008,2009],{"class":184,"line":345},[182,2010,287],{"emptyLinePlaceholder":286},[182,2012,2013],{"class":184,"line":370},[182,2014,2015],{"class":292},"# 2. 设置必要的环境变量 (模拟 .env 配置)\n",[182,2017,2018,2021,2023,2026,2028,2030,2033,2035,2038,2041,2043,2046],{"class":184,"line":375},[182,2019,2020],{"class":192},"os",[182,2022,197],{"class":196},[182,2024,2025],{"class":1465},"environ",[182,2027,426],{"class":196},[182,2029,429],{"class":196},[182,2031,2032],{"class":432},"ENABLE_CHAT_API",[182,2034,429],{"class":196},[182,2036,2037],{"class":196},"]",[182,2039,2040],{"class":196}," =",[182,2042,1364],{"class":196},[182,2044,2045],{"class":432},"true",[182,2047,1369],{"class":196},[182,2049,2050,2052,2054,2056,2058,2060,2063,2065,2067,2069,2071,2073],{"class":184,"line":381},[182,2051,2020],{"class":192},[182,2053,197],{"class":196},[182,2055,2025],{"class":1465},[182,2057,426],{"class":196},[182,2059,429],{"class":196},[182,2061,2062],{"class":432},"MOS_ENABLE_SCHEDULER",[182,2064,429],{"class":196},[182,2066,2037],{"class":196},[182,2068,2040],{"class":196},[182,2070,1364],{"class":196},[182,2072,2045],{"class":432},[182,2074,1369],{"class":196},[182,2076,2077],{"class":184,"line":387},[182,2078,2079],{"class":292},"# 决定使用 Redis 还是 Local 队列\n",[182,2081,2082,2084,2086,2088,2090,2092,2095,2097,2099,2101,2103,2106,2108],{"class":184,"line":393},[182,2083,2020],{"class":192},[182,2085,197],{"class":196},[182,2087,2025],{"class":1465},[182,2089,426],{"class":196},[182,2091,429],{"class":196},[182,2093,2094],{"class":432},"MOS_SCHEDULER_USE_REDIS_QUEUE",[182,2096,429],{"class":196},[182,2098,2037],{"class":196},[182,2100,2040],{"class":196},[182,2102,1364],{"class":196},[182,2104,2105],{"class":432},"false",[182,2107,429],{"class":196},[182,2109,2110],{"class":192}," \n",[182,2112,2113],{"class":184,"line":398},[182,2114,287],{"emptyLinePlaceholder":286},[182,2116,2117],{"class":184,"line":404},[182,2118,2119],{"class":292},"# --- 导入组件 ---\n",[182,2121,2122],{"class":184,"line":410},[182,2123,2124],{"class":292},"# 注意：导入 server_router 会触发组件初始化，确保环境变量在此之前设置好\n",[182,2126,2127,2129,2131,2133,2135,2137,2140,2142,2145,2147],{"class":184,"line":440},[182,2128,189],{"class":188},[182,2130,193],{"class":192},[182,2132,197],{"class":196},[182,2134,218],{"class":192},[182,2136,197],{"class":196},[182,2138,2139],{"class":192},"product_models ",[182,2141,203],{"class":188},[182,2143,2144],{"class":192}," APIADDRequest",[182,2146,1995],{"class":196},[182,2148,2149],{"class":192}," ChatPlaygroundRequest\n",[182,2151,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170],{"class":184,"line":445},[182,2153,189],{"class":188},[182,2155,193],{"class":192},[182,2157,197],{"class":196},[182,2159,218],{"class":192},[182,2161,197],{"class":196},[182,2163,1310],{"class":192},[182,2165,197],{"class":196},[182,2167,1315],{"class":192},[182,2169,203],{"class":188},[182,2171,2172],{"class":196}," (\n",[182,2174,2175,2178],{"class":184,"line":451},[182,2176,2177],{"class":192},"    add_handler",[182,2179,1616],{"class":196},[182,2181,2182,2185],{"class":184,"line":457},[182,2183,2184],{"class":192},"    chat_stream_playground",[182,2186,1616],{"class":196},[182,2188,2189,2192,2194],{"class":184,"line":478},[182,2190,2191],{"class":192},"    mem_scheduler",[182,2193,1995],{"class":196},[182,2195,2196],{"class":292},"  # 这里的 mem_scheduler 已经是初始化好的单例\n",[182,2198,2199],{"class":184,"line":1535},[182,2200,367],{"class":196},[182,2202,2203,2205,2207,2209,2212,2214],{"class":184,"line":1546},[182,2204,189],{"class":188},[182,2206,193],{"class":192},[182,2208,197],{"class":196},[182,2210,2211],{"class":192},"log ",[182,2213,203],{"class":188},[182,2215,2216],{"class":192}," get_logger\n",[182,2218,2219,2221,2223,2225,2227,2229,2231,2233,2235,2237],{"class":184,"line":1552},[182,2220,189],{"class":188},[182,2222,193],{"class":192},[182,2224,197],{"class":196},[182,2226,244],{"class":192},[182,2228,197],{"class":196},[182,2230,1335],{"class":192},[182,2232,197],{"class":196},[182,2234,1340],{"class":192},[182,2236,203],{"class":188},[182,2238,1345],{"class":192},[182,2240,2241,2243,2245,2247,2249,2251,2253,2255,2258,2260],{"class":184,"line":1557},[182,2242,189],{"class":188},[182,2244,193],{"class":192},[182,2246,197],{"class":196},[182,2248,244],{"class":192},[182,2250,197],{"class":196},[182,2252,1335],{"class":192},[182,2254,197],{"class":196},[182,2256,2257],{"class":192},"task_schemas ",[182,2259,203],{"class":188},[182,2261,2172],{"class":196},[182,2263,2264,2267],{"class":184,"line":1563},[182,2265,2266],{"class":192},"    MEM_UPDATE_TASK_LABEL",[182,2268,1616],{"class":196},[182,2270,2271,2274],{"class":184,"line":1577},[182,2272,2273],{"class":192},"    QUERY_TASK_LABEL",[182,2275,1616],{"class":196},[182,2277,2278],{"class":184,"line":1601},[182,2279,367],{"class":196},[182,2281,2282],{"class":184,"line":1619},[182,2283,287],{"emptyLinePlaceholder":286},[182,2285,2286,2289,2291,2294,2296,2299],{"class":184,"line":1636},[182,2287,2288],{"class":192},"logger ",[182,2290,319],{"class":196},[182,2292,2293],{"class":327}," get_logger",[182,2295,361],{"class":196},[182,2297,2298],{"class":192},"__name__",[182,2300,367],{"class":196},[182,2302,2303],{"class":184,"line":1649},[182,2304,287],{"emptyLinePlaceholder":286},[182,2306,2307],{"class":184,"line":1666},[182,2308,2309],{"class":292},"# 全局变量用于演示记忆检索结果\n",[182,2311,2312,2315,2317],{"class":184,"line":1683},[182,2313,2314],{"class":192},"working_memories ",[182,2316,319],{"class":196},[182,2318,2319],{"class":196}," []\n",[182,2321,2322],{"class":184,"line":1688},[182,2323,287],{"emptyLinePlaceholder":286},[182,2325,2326],{"class":184,"line":1693},[182,2327,2328],{"class":292},"# --- 自定义处理器 ---\n",[182,2330,2331],{"class":184,"line":1699},[182,2332,287],{"emptyLinePlaceholder":286},[182,2334,2335,2337,2340,2342,2344,2346,2348,2350,2352],{"class":184,"line":1705},[182,2336,1388],{"class":1387},[182,2338,2339],{"class":327}," custom_query_handler",[182,2341,361],{"class":196},[182,2343,1397],{"class":1396},[182,2345,415],{"class":196},[182,2347,1402],{"class":192},[182,2349,426],{"class":196},[182,2351,721],{"class":192},[182,2353,1409],{"class":196},[182,2355,2356],{"class":184,"line":1724},[182,2357,1414],{"class":188},[182,2359,2360],{"class":184,"line":1729},[182,2361,2362],{"class":292},"    处理用户查询消息：\n",[182,2364,2365],{"class":184,"line":1756},[182,2366,2367],{"class":292},"    1. 打印查询内容\n",[182,2369,2370],{"class":184,"line":1761},[182,2371,2372],{"class":292},"    2. 将消息转换为 MEM_UPDATE 任务，触发记忆检索\u002F更新流程\n",[182,2374,2375],{"class":184,"line":1767},[182,2376,1414],{"class":188},[182,2378,2380,2382,2384,2386,2388],{"class":184,"line":2379},48,[182,2381,1428],{"class":188},[182,2383,1431],{"class":192},[182,2385,1434],{"class":188},[182,2387,1437],{"class":192},[182,2389,1440],{"class":196},[182,2391,2393,2395,2397,2399,2401,2404,2407,2409,2411,2413,2415,2417,2419],{"class":184,"line":2392},49,[182,2394,1445],{"class":327},[182,2396,361],{"class":196},[182,2398,1450],{"class":1387},[182,2400,429],{"class":432},[182,2402,2403],{"class":192},"\\n",[182,2405,2406],{"class":432},"[Scheduler 🟢] 收到用户查询: ",[182,2408,1457],{"class":1456},[182,2410,1460],{"class":327},[182,2412,197],{"class":196},[182,2414,836],{"class":1465},[182,2416,1468],{"class":1456},[182,2418,429],{"class":432},[182,2420,367],{"class":196},[182,2422,2424],{"class":184,"line":2423},50,[182,2425,2426],{"class":192},"        \n",[182,2428,2430],{"class":184,"line":2429},51,[182,2431,2432],{"class":292},"        # 复制消息并将标签改为 MEM_UPDATE，这是一种常见的“任务链”模式\n",[182,2434,2436,2439,2441,2444,2446,2449,2451,2454,2457,2459,2461,2463,2465,2468],{"class":184,"line":2435},52,[182,2437,2438],{"class":192},"        new_msg ",[182,2440,319],{"class":196},[182,2442,2443],{"class":192}," msg",[182,2445,197],{"class":196},[182,2447,2448],{"class":327},"model_copy",[182,2450,361],{"class":196},[182,2452,2453],{"class":1396},"update",[182,2455,2456],{"class":196},"={",[182,2458,429],{"class":196},[182,2460,815],{"class":432},[182,2462,429],{"class":196},[182,2464,415],{"class":196},[182,2466,2467],{"class":327}," MEM_UPDATE_TASK_LABEL",[182,2469,1549],{"class":196},[182,2471,2473],{"class":184,"line":2472},53,[182,2474,2426],{"class":192},[182,2476,2478],{"class":184,"line":2477},54,[182,2479,2480],{"class":292},"        # 提交新任务回调度器\n",[182,2482,2484,2487,2489,2491,2493,2496],{"class":184,"line":2483},55,[182,2485,2486],{"class":192},"        mem_scheduler",[182,2488,197],{"class":196},[182,2490,1712],{"class":327},[182,2492,1715],{"class":196},[182,2494,2495],{"class":327},"new_msg",[182,2497,1721],{"class":196},[182,2499,2501],{"class":184,"line":2500},56,[182,2502,287],{"emptyLinePlaceholder":286},[182,2504,2506],{"class":184,"line":2505},57,[182,2507,287],{"emptyLinePlaceholder":286},[182,2509,2511,2513,2516,2518,2520,2522,2524,2526,2528],{"class":184,"line":2510},58,[182,2512,1388],{"class":1387},[182,2514,2515],{"class":327}," custom_mem_update_handler",[182,2517,361],{"class":196},[182,2519,1397],{"class":1396},[182,2521,415],{"class":196},[182,2523,1402],{"class":192},[182,2525,426],{"class":196},[182,2527,721],{"class":192},[182,2529,1409],{"class":196},[182,2531,2533],{"class":184,"line":2532},59,[182,2534,1414],{"class":188},[182,2536,2538],{"class":184,"line":2537},60,[182,2539,2540],{"class":292},"    处理记忆更新任务：\n",[182,2542,2544],{"class":184,"line":2543},61,[182,2545,2546],{"class":292},"    1. 使用检索器 (Retriever) 查找相关记忆\n",[182,2548,2550],{"class":184,"line":2549},62,[182,2551,2552],{"class":292},"    2. 更新全局的工作记忆列表\n",[182,2554,2556],{"class":184,"line":2555},63,[182,2557,1414],{"class":188},[182,2559,2561,2564],{"class":184,"line":2560},64,[182,2562,2563],{"class":1387},"    global",[182,2565,2566],{"class":192}," working_memories\n",[182,2568,2570,2573,2575],{"class":184,"line":2569},65,[182,2571,2572],{"class":192},"    search_args ",[182,2574,319],{"class":196},[182,2576,2577],{"class":196}," {}\n",[182,2579,2581,2584,2586],{"class":184,"line":2580},66,[182,2582,2583],{"class":192},"    top_k ",[182,2585,319],{"class":196},[182,2587,2588],{"class":1456}," 2\n",[182,2590,2592],{"class":184,"line":2591},67,[182,2593,2594],{"class":192},"    \n",[182,2596,2598,2600,2602,2604,2606],{"class":184,"line":2597},68,[182,2599,1428],{"class":188},[182,2601,1431],{"class":192},[182,2603,1434],{"class":188},[182,2605,1437],{"class":192},[182,2607,1440],{"class":196},[182,2609,2611,2613,2615,2617,2620],{"class":184,"line":2610},69,[182,2612,1445],{"class":327},[182,2614,361],{"class":196},[182,2616,1450],{"class":1387},[182,2618,2619],{"class":432},"\"[Scheduler 🔵] 正在为查询检索记忆...\"",[182,2621,367],{"class":196},[182,2623,2625],{"class":184,"line":2624},70,[182,2626,2627],{"class":292},"        # 调用核心检索功能\n",[182,2629,2631,2634,2636,2639,2641,2644,2646,2649],{"class":184,"line":2630},71,[182,2632,2633],{"class":192},"        results ",[182,2635,319],{"class":196},[182,2637,2638],{"class":192}," mem_scheduler",[182,2640,197],{"class":196},[182,2642,2643],{"class":1465},"retriever",[182,2645,197],{"class":196},[182,2647,2648],{"class":327},"search",[182,2650,1574],{"class":196},[182,2652,2654,2657,2659,2661,2663,2665],{"class":184,"line":2653},72,[182,2655,2656],{"class":1396},"            query",[182,2658,319],{"class":196},[182,2660,1460],{"class":327},[182,2662,197],{"class":196},[182,2664,836],{"class":1465},[182,2666,1616],{"class":196},[182,2668,2670,2673,2675,2677,2679,2681],{"class":184,"line":2669},73,[182,2671,2672],{"class":1396},"            user_id",[182,2674,319],{"class":196},[182,2676,1460],{"class":327},[182,2678,197],{"class":196},[182,2680,783],{"class":1465},[182,2682,1616],{"class":196},[182,2684,2686,2689,2691,2693,2695,2697],{"class":184,"line":2685},74,[182,2687,2688],{"class":1396},"            mem_cube_id",[182,2690,319],{"class":196},[182,2692,1460],{"class":327},[182,2694,197],{"class":196},[182,2696,738],{"class":1465},[182,2698,1616],{"class":196},[182,2700,2702,2705,2707,2709,2711,2714],{"class":184,"line":2701},75,[182,2703,2704],{"class":1396},"            mem_cube",[182,2706,319],{"class":196},[182,2708,244],{"class":327},[182,2710,197],{"class":196},[182,2712,2713],{"class":1465},"current_mem_cube",[182,2715,1616],{"class":196},[182,2717,2719,2722,2724,2727],{"class":184,"line":2718},76,[182,2720,2721],{"class":1396},"            top_k",[182,2723,319],{"class":196},[182,2725,2726],{"class":327},"top_k",[182,2728,1616],{"class":196},[182,2730,2732,2735,2737,2739,2741,2744],{"class":184,"line":2731},77,[182,2733,2734],{"class":1396},"            method",[182,2736,319],{"class":196},[182,2738,244],{"class":327},[182,2740,197],{"class":196},[182,2742,2743],{"class":1465},"search_method",[182,2745,1616],{"class":196},[182,2747,2749,2752,2754,2757],{"class":184,"line":2748},78,[182,2750,2751],{"class":1396},"            search_args",[182,2753,319],{"class":196},[182,2755,2756],{"class":327},"search_args",[182,2758,1616],{"class":196},[182,2760,2762],{"class":184,"line":2761},79,[182,2763,2764],{"class":196},"        )\n",[182,2766,2768],{"class":184,"line":2767},80,[182,2769,2426],{"class":192},[182,2771,2773],{"class":184,"line":2772},81,[182,2774,2775],{"class":292},"        # 模拟工作记忆的更新\n",[182,2777,2779,2782,2784,2787,2789,2792],{"class":184,"line":2778},82,[182,2780,2781],{"class":192},"        working_memories",[182,2783,197],{"class":196},[182,2785,2786],{"class":327},"extend",[182,2788,361],{"class":196},[182,2790,2791],{"class":327},"results",[182,2793,367],{"class":196},[182,2795,2797,2800,2802,2805,2808,2811,2814],{"class":184,"line":2796},83,[182,2798,2799],{"class":192},"        working_memories ",[182,2801,319],{"class":196},[182,2803,2804],{"class":192}," working_memories",[182,2806,2807],{"class":196},"[-",[182,2809,2810],{"class":1456},"5",[182,2812,2813],{"class":196},":]",[182,2815,2816],{"class":292}," # 保持最新的5条\n",[182,2818,2820],{"class":184,"line":2819},84,[182,2821,2426],{"class":192},[182,2823,2825,2828,2831,2833,2836],{"class":184,"line":2824},85,[182,2826,2827],{"class":188},"        for",[182,2829,2830],{"class":192}," mem ",[182,2832,1434],{"class":188},[182,2834,2835],{"class":192}," results",[182,2837,1440],{"class":196},[182,2839,2841],{"class":184,"line":2840},86,[182,2842,2843],{"class":292},"            # 打印检索到的记忆片段\n",[182,2845,2847,2850,2852,2854,2857,2859,2862,2864,2867,2870,2873,2875,2877,2880],{"class":184,"line":2846},87,[182,2848,2849],{"class":327},"            print",[182,2851,361],{"class":196},[182,2853,1450],{"class":1387},[182,2855,2856],{"class":432},"\"  ↳ [Memory Found]: ",[182,2858,1457],{"class":1456},[182,2860,2861],{"class":327},"mem",[182,2863,197],{"class":196},[182,2865,2866],{"class":1465},"memory",[182,2868,2869],{"class":196},"[:",[182,2871,2872],{"class":1456},"50",[182,2874,2037],{"class":196},[182,2876,1468],{"class":1456},[182,2878,2879],{"class":432},"...\"",[182,2881,367],{"class":196},[182,2883,2885],{"class":184,"line":2884},88,[182,2886,287],{"emptyLinePlaceholder":286},[182,2888,2890],{"class":184,"line":2889},89,[182,2891,2892],{"class":292},"# --- 模拟业务数据 ---\n",[182,2894,2896],{"class":184,"line":2895},90,[182,2897,287],{"emptyLinePlaceholder":286},[182,2899,2901,2903,2906],{"class":184,"line":2900},91,[182,2902,1388],{"class":1387},[182,2904,2905],{"class":327}," get_mock_data",[182,2907,2908],{"class":196},"():\n",[182,2910,2912,2915,2918],{"class":184,"line":2911},92,[182,2913,2914],{"class":188},"    \"\"\"",[182,2916,2917],{"class":292},"生成模拟对话数据",[182,2919,2920],{"class":188},"\"\"\"\n",[182,2922,2924,2927,2929],{"class":184,"line":2923},93,[182,2925,2926],{"class":192},"    conversations ",[182,2928,319],{"class":196},[182,2930,2931],{"class":196}," [\n",[182,2933,2935,2938,2940,2943,2945,2947,2949,2952,2954,2956,2958,2960,2962,2964,2966,2969,2971],{"class":184,"line":2934},94,[182,2936,2937],{"class":196},"        {",[182,2939,429],{"class":196},[182,2941,2942],{"class":432},"role",[182,2944,429],{"class":196},[182,2946,415],{"class":196},[182,2948,1364],{"class":196},[182,2950,2951],{"class":432},"user",[182,2953,429],{"class":196},[182,2955,1995],{"class":196},[182,2957,1364],{"class":196},[182,2959,836],{"class":432},[182,2961,429],{"class":196},[182,2963,415],{"class":196},[182,2965,1364],{"class":196},[182,2967,2968],{"class":432},"I just adopted a golden retriever puppy named Max.",[182,2970,429],{"class":196},[182,2972,2973],{"class":196},"},\n",[182,2975,2977,2979,2981,2983,2985,2987,2989,2992,2994,2996,2998,3000,3002,3004,3006,3009,3011],{"class":184,"line":2976},95,[182,2978,2937],{"class":196},[182,2980,429],{"class":196},[182,2982,2942],{"class":432},[182,2984,429],{"class":196},[182,2986,415],{"class":196},[182,2988,1364],{"class":196},[182,2990,2991],{"class":432},"assistant",[182,2993,429],{"class":196},[182,2995,1995],{"class":196},[182,2997,1364],{"class":196},[182,2999,836],{"class":432},[182,3001,429],{"class":196},[182,3003,415],{"class":196},[182,3005,1364],{"class":196},[182,3007,3008],{"class":432},"That's exciting! Max is a great name.",[182,3010,429],{"class":196},[182,3012,2973],{"class":196},[182,3014,3016,3018,3020,3022,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3047,3049],{"class":184,"line":3015},96,[182,3017,2937],{"class":196},[182,3019,429],{"class":196},[182,3021,2942],{"class":432},[182,3023,429],{"class":196},[182,3025,415],{"class":196},[182,3027,1364],{"class":196},[182,3029,2951],{"class":432},[182,3031,429],{"class":196},[182,3033,1995],{"class":196},[182,3035,1364],{"class":196},[182,3037,836],{"class":432},[182,3039,429],{"class":196},[182,3041,415],{"class":196},[182,3043,1364],{"class":196},[182,3045,3046],{"class":432},"He loves peanut butter treats but I am allergic to nuts.",[182,3048,429],{"class":196},[182,3050,2973],{"class":196},[182,3052,3054,3056,3058,3060,3062,3064,3066,3068,3070,3072,3074,3076,3078,3080,3082,3085,3087],{"class":184,"line":3053},97,[182,3055,2937],{"class":196},[182,3057,429],{"class":196},[182,3059,2942],{"class":432},[182,3061,429],{"class":196},[182,3063,415],{"class":196},[182,3065,1364],{"class":196},[182,3067,2991],{"class":432},[182,3069,429],{"class":196},[182,3071,1995],{"class":196},[182,3073,1364],{"class":196},[182,3075,836],{"class":432},[182,3077,429],{"class":196},[182,3079,415],{"class":196},[182,3081,1364],{"class":196},[182,3083,3084],{"class":432},"Noted. Peanut butter for Max, no nuts for you.",[182,3086,429],{"class":196},[182,3088,2973],{"class":196},[182,3090,3092],{"class":184,"line":3091},98,[182,3093,3094],{"class":196},"    ]\n",[182,3096,3098],{"class":184,"line":3097},99,[182,3099,2594],{"class":192},[182,3101,3103,3106,3108],{"class":184,"line":3102},100,[182,3104,3105],{"class":192},"    questions ",[182,3107,319],{"class":196},[182,3109,2931],{"class":196},[182,3111,3113,3115,3117,3120,3122,3124,3126,3129,3131,3133,3135,3138,3140,3142,3144,3147,3149],{"class":184,"line":3112},101,[182,3114,2937],{"class":196},[182,3116,429],{"class":196},[182,3118,3119],{"class":432},"question",[182,3121,429],{"class":196},[182,3123,415],{"class":196},[182,3125,1364],{"class":196},[182,3127,3128],{"class":432},"What is my dog's name?",[182,3130,429],{"class":196},[182,3132,1995],{"class":196},[182,3134,1364],{"class":196},[182,3136,3137],{"class":432},"category",[182,3139,429],{"class":196},[182,3141,415],{"class":196},[182,3143,1364],{"class":196},[182,3145,3146],{"class":432},"Pet",[182,3148,429],{"class":196},[182,3150,2973],{"class":196},[182,3152,3154,3156,3158,3160,3162,3164,3166,3169,3171,3173,3175,3177,3179,3181,3183,3186,3188],{"class":184,"line":3153},102,[182,3155,2937],{"class":196},[182,3157,429],{"class":196},[182,3159,3119],{"class":432},[182,3161,429],{"class":196},[182,3163,415],{"class":196},[182,3165,1364],{"class":196},[182,3167,3168],{"class":432},"What am I allergic to?",[182,3170,429],{"class":196},[182,3172,1995],{"class":196},[182,3174,1364],{"class":196},[182,3176,3137],{"class":432},[182,3178,429],{"class":196},[182,3180,415],{"class":196},[182,3182,1364],{"class":196},[182,3184,3185],{"class":432},"Allergy",[182,3187,429],{"class":196},[182,3189,2973],{"class":196},[182,3191,3193],{"class":184,"line":3192},103,[182,3194,3094],{"class":196},[182,3196,3198,3201,3204,3206],{"class":184,"line":3197},104,[182,3199,3200],{"class":188},"    return",[182,3202,3203],{"class":192}," conversations",[182,3205,1995],{"class":196},[182,3207,3208],{"class":192}," questions\n",[182,3210,3212],{"class":184,"line":3211},105,[182,3213,287],{"emptyLinePlaceholder":286},[182,3215,3217],{"class":184,"line":3216},106,[182,3218,3219],{"class":292},"# --- 主流程 ---\n",[182,3221,3223],{"class":184,"line":3222},107,[182,3224,287],{"emptyLinePlaceholder":286},[182,3226,3228,3231,3234,3237],{"class":184,"line":3227},108,[182,3229,3230],{"class":1387},"async",[182,3232,3233],{"class":1387}," def",[182,3235,3236],{"class":327}," run_demo",[182,3238,2908],{"class":196},[182,3240,3242,3245,3247,3249,3252,3254],{"class":184,"line":3241},109,[182,3243,3244],{"class":327},"    print",[182,3246,361],{"class":196},[182,3248,429],{"class":196},[182,3250,3251],{"class":432},"==== MemScheduler Demo Start ====",[182,3253,429],{"class":196},[182,3255,367],{"class":196},[182,3257,3259,3262,3264,3267,3269,3271],{"class":184,"line":3258},110,[182,3260,3261],{"class":192},"    conversations",[182,3263,1995],{"class":196},[182,3265,3266],{"class":192}," questions ",[182,3268,319],{"class":196},[182,3270,2905],{"class":327},[182,3272,331],{"class":196},[182,3274,3276],{"class":184,"line":3275},111,[182,3277,287],{"emptyLinePlaceholder":286},[182,3279,3281,3284,3286,3288,3291],{"class":184,"line":3280},112,[182,3282,3283],{"class":192},"    user_id ",[182,3285,319],{"class":196},[182,3287,1364],{"class":196},[182,3289,3290],{"class":432},"demo_user_001",[182,3292,1369],{"class":196},[182,3294,3296,3299,3301,3303,3306],{"class":184,"line":3295},113,[182,3297,3298],{"class":192},"    mem_cube_id ",[182,3300,319],{"class":196},[182,3302,1364],{"class":196},[182,3304,3305],{"class":432},"cube_demo_001",[182,3307,1369],{"class":196},[182,3309,3311],{"class":184,"line":3310},114,[182,3312,287],{"emptyLinePlaceholder":286},[182,3314,3316,3318,3320,3322,3325,3327,3329,3331,3334],{"class":184,"line":3315},115,[182,3317,3244],{"class":327},[182,3319,361],{"class":196},[182,3321,1450],{"class":1387},[182,3323,3324],{"class":432},"\"1. 初始化用户记忆库 (",[182,3326,1457],{"class":1456},[182,3328,783],{"class":327},[182,3330,1468],{"class":1456},[182,3332,3333],{"class":432},")...\"",[182,3335,367],{"class":196},[182,3337,3339],{"class":184,"line":3338},116,[182,3340,3341],{"class":292},"    # 使用 API Handler 添加初始记忆 (同步模式)\n",[182,3343,3345,3348,3350,3352],{"class":184,"line":3344},117,[182,3346,3347],{"class":192},"    add_req ",[182,3349,319],{"class":196},[182,3351,2144],{"class":327},[182,3353,1574],{"class":196},[182,3355,3357,3360,3362,3364],{"class":184,"line":3356},118,[182,3358,3359],{"class":1396},"        user_id",[182,3361,319],{"class":196},[182,3363,783],{"class":327},[182,3365,1616],{"class":196},[182,3367,3369,3372,3375,3377],{"class":184,"line":3368},119,[182,3370,3371],{"class":1396},"        writable_cube_ids",[182,3373,3374],{"class":196},"=[",[182,3376,738],{"class":327},[182,3378,3379],{"class":196},"],\n",[182,3381,3383,3386,3388,3391],{"class":184,"line":3382},120,[182,3384,3385],{"class":1396},"        messages",[182,3387,319],{"class":196},[182,3389,3390],{"class":327},"conversations",[182,3392,1616],{"class":196},[182,3394,3396,3399,3401,3403,3406,3408,3410],{"class":184,"line":3395},121,[182,3397,3398],{"class":1396},"        async_mode",[182,3400,319],{"class":196},[182,3402,429],{"class":196},[182,3404,3405],{"class":432},"sync",[182,3407,429],{"class":196},[182,3409,1995],{"class":196},[182,3411,2110],{"class":327},[182,3413,3415],{"class":184,"line":3414},122,[182,3416,3417],{"class":196},"    )\n",[182,3419,3421,3423,3425,3428,3430,3433],{"class":184,"line":3420},123,[182,3422,2177],{"class":192},[182,3424,197],{"class":196},[182,3426,3427],{"class":327},"handle_add_memories",[182,3429,361],{"class":196},[182,3431,3432],{"class":327},"add_req",[182,3434,367],{"class":196},[182,3436,3438,3440,3442,3444,3447,3449],{"class":184,"line":3437},124,[182,3439,3244],{"class":327},[182,3441,361],{"class":196},[182,3443,429],{"class":196},[182,3445,3446],{"class":432},"   记忆添加完成。",[182,3448,429],{"class":196},[182,3450,367],{"class":196},[182,3452,3454],{"class":184,"line":3453},125,[182,3455,287],{"emptyLinePlaceholder":286},[182,3457,3459,3461,3463,3465,3467,3470,3472],{"class":184,"line":3458},126,[182,3460,3244],{"class":327},[182,3462,361],{"class":196},[182,3464,429],{"class":196},[182,3466,2403],{"class":192},[182,3468,3469],{"class":432},"2. 开始对话测试 (并在后台触发调度任务)...",[182,3471,429],{"class":196},[182,3473,367],{"class":196},[182,3475,3477,3479,3482,3484,3487],{"class":184,"line":3476},127,[182,3478,1428],{"class":188},[182,3480,3481],{"class":192}," item ",[182,3483,1434],{"class":188},[182,3485,3486],{"class":192}," questions",[182,3488,1440],{"class":196},[182,3490,3492,3495,3497,3500,3502,3504,3506,3508],{"class":184,"line":3491},128,[182,3493,3494],{"class":192},"        query ",[182,3496,319],{"class":196},[182,3498,3499],{"class":192}," item",[182,3501,426],{"class":196},[182,3503,429],{"class":196},[182,3505,3119],{"class":432},[182,3507,429],{"class":196},[182,3509,437],{"class":196},[182,3511,3513,3515,3517,3519,3521,3523,3526,3528,3530,3532,3534],{"class":184,"line":3512},129,[182,3514,1445],{"class":327},[182,3516,361],{"class":196},[182,3518,1450],{"class":1387},[182,3520,429],{"class":432},[182,3522,2403],{"class":192},[182,3524,3525],{"class":432},">> User: ",[182,3527,1457],{"class":1456},[182,3529,534],{"class":327},[182,3531,1468],{"class":1456},[182,3533,429],{"class":432},[182,3535,367],{"class":196},[182,3537,3539],{"class":184,"line":3538},130,[182,3540,287],{"emptyLinePlaceholder":286},[182,3542,3544],{"class":184,"line":3543},131,[182,3545,3546],{"class":292},"        # 发起聊天请求\n",[182,3548,3550,3553,3555,3558],{"class":184,"line":3549},132,[182,3551,3552],{"class":192},"        chat_req ",[182,3554,319],{"class":196},[182,3556,3557],{"class":327}," ChatPlaygroundRequest",[182,3559,1574],{"class":196},[182,3561,3563,3565,3567,3569],{"class":184,"line":3562},133,[182,3564,2672],{"class":1396},[182,3566,319],{"class":196},[182,3568,783],{"class":327},[182,3570,1616],{"class":196},[182,3572,3574,3576,3578,3580],{"class":184,"line":3573},134,[182,3575,2656],{"class":1396},[182,3577,319],{"class":196},[182,3579,534],{"class":327},[182,3581,1616],{"class":196},[182,3583,3585,3588,3590,3592],{"class":184,"line":3584},135,[182,3586,3587],{"class":1396},"            readable_cube_ids",[182,3589,3374],{"class":196},[182,3591,738],{"class":327},[182,3593,3379],{"class":196},[182,3595,3597,3600,3602,3604],{"class":184,"line":3596},136,[182,3598,3599],{"class":1396},"            writable_cube_ids",[182,3601,3374],{"class":196},[182,3603,738],{"class":327},[182,3605,3379],{"class":196},[182,3607,3609],{"class":184,"line":3608},137,[182,3610,2764],{"class":196},[182,3612,3614],{"class":184,"line":3613},138,[182,3615,2426],{"class":192},[182,3617,3619],{"class":184,"line":3618},139,[182,3620,3621],{"class":292},"        # 获取流式响应\n",[182,3623,3625,3628,3630,3633,3635,3638],{"class":184,"line":3624},140,[182,3626,3627],{"class":192},"        response ",[182,3629,319],{"class":196},[182,3631,3632],{"class":327}," chat_stream_playground",[182,3634,361],{"class":196},[182,3636,3637],{"class":327},"chat_req",[182,3639,367],{"class":196},[182,3641,3643],{"class":184,"line":3642},141,[182,3644,2426],{"class":192},[182,3646,3648],{"class":184,"line":3647},142,[182,3649,3650],{"class":292},"        # 处理流式输出 (简化版)\n",[182,3652,3654,3657,3659],{"class":184,"line":3653},143,[182,3655,3656],{"class":192},"        full_answer ",[182,3658,319],{"class":196},[182,3660,3661],{"class":196}," \"\"\n",[182,3663,3665,3668,3670],{"class":184,"line":3664},144,[182,3666,3667],{"class":192},"        buffer ",[182,3669,319],{"class":196},[182,3671,3661],{"class":196},[182,3673,3675,3678,3681,3684,3686,3689,3691,3694],{"class":184,"line":3674},145,[182,3676,3677],{"class":188},"        async",[182,3679,3680],{"class":188}," for",[182,3682,3683],{"class":192}," chunk ",[182,3685,1434],{"class":188},[182,3687,3688],{"class":192}," response",[182,3690,197],{"class":196},[182,3692,3693],{"class":1465},"body_iterator",[182,3695,1440],{"class":196},[182,3697,3699,3702,3705,3707,3710,3712,3715],{"class":184,"line":3698},146,[182,3700,3701],{"class":188},"            if",[182,3703,3704],{"class":327}," isinstance",[182,3706,361],{"class":196},[182,3708,3709],{"class":327},"chunk",[182,3711,1995],{"class":196},[182,3713,3714],{"class":1585}," bytes",[182,3716,3717],{"class":196},"):\n",[182,3719,3721,3724,3726,3729,3731,3734,3736,3738,3741,3743],{"class":184,"line":3720},147,[182,3722,3723],{"class":192},"                chunk ",[182,3725,319],{"class":196},[182,3727,3728],{"class":192}," chunk",[182,3730,197],{"class":196},[182,3732,3733],{"class":327},"decode",[182,3735,361],{"class":196},[182,3737,429],{"class":196},[182,3739,3740],{"class":432},"utf-8",[182,3742,429],{"class":196},[182,3744,367],{"class":196},[182,3746,3748,3751,3754],{"class":184,"line":3747},148,[182,3749,3750],{"class":192},"            buffer ",[182,3752,3753],{"class":196},"+=",[182,3755,3756],{"class":192}," chunk\n",[182,3758,3760,3763,3765,3768,3770,3773,3776],{"class":184,"line":3759},149,[182,3761,3762],{"class":188},"            while",[182,3764,1364],{"class":196},[182,3766,3767],{"class":192},"\\n\\n",[182,3769,429],{"class":196},[182,3771,3772],{"class":196}," in",[182,3774,3775],{"class":192}," buffer",[182,3777,1440],{"class":196},[182,3779,3781,3784,3786,3789,3791,3793,3795,3798,3800,3802,3804,3806,3808,3811],{"class":184,"line":3780},150,[182,3782,3783],{"class":192},"                msg",[182,3785,1995],{"class":196},[182,3787,3788],{"class":192}," buffer ",[182,3790,319],{"class":196},[182,3792,3775],{"class":192},[182,3794,197],{"class":196},[182,3796,3797],{"class":327},"split",[182,3799,361],{"class":196},[182,3801,429],{"class":196},[182,3803,3767],{"class":192},[182,3805,429],{"class":196},[182,3807,1995],{"class":196},[182,3809,3810],{"class":1456}," 1",[182,3812,367],{"class":196},[182,3814,3816,3819,3822,3824,3826,3828,3830,3832,3834,3836,3838],{"class":184,"line":3815},151,[182,3817,3818],{"class":188},"                for",[182,3820,3821],{"class":192}," line ",[182,3823,1434],{"class":188},[182,3825,2443],{"class":192},[182,3827,197],{"class":196},[182,3829,3797],{"class":327},[182,3831,361],{"class":196},[182,3833,429],{"class":196},[182,3835,2403],{"class":192},[182,3837,429],{"class":196},[182,3839,3717],{"class":196},[182,3841,3843,3846,3849,3851,3854,3856,3858,3861,3863],{"class":184,"line":3842},152,[182,3844,3845],{"class":188},"                    if",[182,3847,3848],{"class":192}," line",[182,3850,197],{"class":196},[182,3852,3853],{"class":327},"startswith",[182,3855,361],{"class":196},[182,3857,429],{"class":196},[182,3859,3860],{"class":432},"data: ",[182,3862,429],{"class":196},[182,3864,3717],{"class":196},[182,3866,3868,3871],{"class":184,"line":3867},153,[182,3869,3870],{"class":188},"                        try",[182,3872,1440],{"class":196},[182,3874,3876,3879,3881,3884,3886,3889,3891,3893,3895,3898],{"class":184,"line":3875},154,[182,3877,3878],{"class":192},"                            data ",[182,3880,319],{"class":196},[182,3882,3883],{"class":192}," json",[182,3885,197],{"class":196},[182,3887,3888],{"class":327},"loads",[182,3890,361],{"class":196},[182,3892,184],{"class":327},[182,3894,426],{"class":196},[182,3896,3897],{"class":1456},"6",[182,3899,3900],{"class":196},":])\n",[182,3902,3904,3907,3910,3912,3915,3917,3919,3922,3924,3926,3929,3931,3934,3936],{"class":184,"line":3903},155,[182,3905,3906],{"class":188},"                            if",[182,3908,3909],{"class":192}," data",[182,3911,197],{"class":196},[182,3913,3914],{"class":327},"get",[182,3916,361],{"class":196},[182,3918,429],{"class":196},[182,3920,3921],{"class":432},"type",[182,3923,429],{"class":196},[182,3925,827],{"class":196},[182,3927,3928],{"class":196}," ==",[182,3930,1364],{"class":196},[182,3932,3933],{"class":432},"text",[182,3935,429],{"class":196},[182,3937,1440],{"class":196},[182,3939,3941,3944,3946,3948,3950,3952,3955,3957],{"class":184,"line":3940},156,[182,3942,3943],{"class":192},"                                full_answer ",[182,3945,3753],{"class":196},[182,3947,3909],{"class":192},[182,3949,426],{"class":196},[182,3951,429],{"class":196},[182,3953,3954],{"class":432},"data",[182,3956,429],{"class":196},[182,3958,437],{"class":196},[182,3960,3962,3965,3967],{"class":184,"line":3961},157,[182,3963,3964],{"class":188},"                        except",[182,3966,415],{"class":196},[182,3968,3969],{"class":188}," pass\n",[182,3971,3973],{"class":184,"line":3972},158,[182,3974,3975],{"class":192},"                        \n",[182,3977,3979,3981,3983,3985,3988,3990,3993,3995,3997],{"class":184,"line":3978},159,[182,3980,1445],{"class":327},[182,3982,361],{"class":196},[182,3984,1450],{"class":1387},[182,3986,3987],{"class":432},"\">> AI: ",[182,3989,1457],{"class":1456},[182,3991,3992],{"class":327},"full_answer",[182,3994,1468],{"class":1456},[182,3996,429],{"class":432},[182,3998,367],{"class":196},[182,4000,4002],{"class":184,"line":4001},160,[182,4003,2426],{"class":192},[182,4005,4007],{"class":184,"line":4006},161,[182,4008,4009],{"class":292},"        # 等待一小会儿让后台调度器处理任务并打印日志\n",[182,4011,4013,4016,4019,4021,4023,4025,4028],{"class":184,"line":4012},162,[182,4014,4015],{"class":188},"        await",[182,4017,4018],{"class":192}," asyncio",[182,4020,197],{"class":196},[182,4022,1775],{"class":327},[182,4024,361],{"class":196},[182,4026,4027],{"class":1456},"1",[182,4029,367],{"class":196},[182,4031,4033],{"class":184,"line":4032},163,[182,4034,287],{"emptyLinePlaceholder":286},[182,4036,4038,4041,4044,4047,4049,4052,4054],{"class":184,"line":4037},164,[182,4039,4040],{"class":188},"if",[182,4042,4043],{"class":192}," __name__ ",[182,4045,4046],{"class":196},"==",[182,4048,1364],{"class":196},[182,4050,4051],{"class":432},"__main__",[182,4053,429],{"class":196},[182,4055,1440],{"class":196},[182,4057,4059],{"class":184,"line":4058},165,[182,4060,4061],{"class":292},"    # 1. 注册我们的自定义 Handler\n",[182,4063,4065],{"class":184,"line":4064},166,[182,4066,4067],{"class":292},"    # 这会覆盖或添加到默认的调度逻辑中\n",[182,4069,4071,4073,4075,4077],{"class":184,"line":4070},167,[182,4072,2191],{"class":192},[182,4074,197],{"class":196},[182,4076,1529],{"class":327},[182,4078,1574],{"class":196},[182,4080,4082],{"class":184,"line":4081},168,[182,4083,4084],{"class":196},"        {\n",[182,4086,4088,4091,4093,4095],{"class":184,"line":4087},169,[182,4089,4090],{"class":327},"            QUERY_TASK_LABEL",[182,4092,415],{"class":196},[182,4094,2339],{"class":327},[182,4096,1616],{"class":196},[182,4098,4100,4103,4105,4107],{"class":184,"line":4099},170,[182,4101,4102],{"class":327},"            MEM_UPDATE_TASK_LABEL",[182,4104,415],{"class":196},[182,4106,2515],{"class":327},[182,4108,1616],{"class":196},[182,4110,4112],{"class":184,"line":4111},171,[182,4113,4114],{"class":196},"        }\n",[182,4116,4118],{"class":184,"line":4117},172,[182,4119,3417],{"class":196},[182,4121,4123],{"class":184,"line":4122},173,[182,4124,2594],{"class":192},[182,4126,4128],{"class":184,"line":4127},174,[182,4129,4130],{"class":292},"    # 2. 确保调度器已启动\n",[182,4132,4134,4137,4140,4142,4144,4147],{"class":184,"line":4133},175,[182,4135,4136],{"class":188},"    if",[182,4138,4139],{"class":196}," not",[182,4141,2638],{"class":192},[182,4143,197],{"class":196},[182,4145,4146],{"class":1465},"_running",[182,4148,1440],{"class":196},[182,4150,4152,4154,4156,4159],{"class":184,"line":4151},176,[182,4153,2486],{"class":192},[182,4155,197],{"class":196},[182,4157,4158],{"class":327},"start",[182,4160,331],{"class":196},[182,4162,4164],{"class":184,"line":4163},177,[182,4165,287],{"emptyLinePlaceholder":286},[182,4167,4169,4172],{"class":184,"line":4168},178,[182,4170,4171],{"class":188},"    try",[182,4173,1440],{"class":196},[182,4175,4177,4180,4182,4185,4187,4190],{"class":184,"line":4176},179,[182,4178,4179],{"class":192},"        asyncio",[182,4181,197],{"class":196},[182,4183,4184],{"class":327},"run",[182,4186,361],{"class":196},[182,4188,4189],{"class":327},"run_demo",[182,4191,4192],{"class":196},"())\n",[182,4194,4196,4199,4202],{"class":184,"line":4195},180,[182,4197,4198],{"class":188},"    except",[182,4200,4201],{"class":1585}," KeyboardInterrupt",[182,4203,1440],{"class":196},[182,4205,4207],{"class":184,"line":4206},181,[182,4208,4209],{"class":188},"        pass\n",[182,4211,4213,4216],{"class":184,"line":4212},182,[182,4214,4215],{"class":188},"    finally",[182,4217,1440],{"class":196},[182,4219,4221],{"class":184,"line":4220},183,[182,4222,4223],{"class":292},"        # 防止调度器主进程提前退出\n",[182,4225,4227,4230,4232,4234,4236,4238],{"class":184,"line":4226},184,[182,4228,4229],{"class":192},"        time",[182,4231,197],{"class":196},[182,4233,1775],{"class":327},[182,4235,361],{"class":196},[182,4237,1780],{"class":1456},[182,4239,367],{"class":196},[182,4241,4243],{"class":184,"line":4242},185,[182,4244,287],{"emptyLinePlaceholder":286},[182,4246,4248,4250,4252,4254,4256,4259,4261],{"class":184,"line":4247},186,[182,4249,1445],{"class":327},[182,4251,361],{"class":196},[182,4253,429],{"class":196},[182,4255,2403],{"class":192},[182,4257,4258],{"class":432},"==== 停止调度器 ====",[182,4260,429],{"class":196},[182,4262,367],{"class":196},[182,4264,4266,4268,4270,4273],{"class":184,"line":4265},187,[182,4267,2486],{"class":192},[182,4269,197],{"class":196},[182,4271,4272],{"class":327},"stop",[182,4274,331],{"class":196},[73,4276,4278],{"id":4277},"场景-2-异步任务并发与断点重启-redis","场景 2: 异步任务并发与断点重启 (Redis)",[66,4280,4281],{},"该示例展示了如何使用 Redis 队列实现异步任务的并发处理以及断点重启功能。运行此示例需要配置 Redis 环境。",[173,4283,4285],{"className":175,"code":4284,"language":177,"meta":178,"style":178},"from pathlib import Path\nfrom time import sleep\n\nfrom memos.api.routers.server_router import mem_scheduler\nfrom memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem\n\n\n# 调试：打印调度器配置\nprint(\"=== Scheduler Configuration Debug ===\")\nprint(f\"Scheduler type: {type(mem_scheduler).__name__}\")\nprint(f\"Config: {mem_scheduler.config}\")\nprint(f\"use_redis_queue: {mem_scheduler.use_redis_queue}\")\nprint(f\"Queue type: {type(mem_scheduler.memos_message_queue).__name__}\")\nprint(f\"Queue maxsize: {getattr(mem_scheduler.memos_message_queue, 'maxsize', 'N\u002FA')}\")\nprint(\"=====================================\\n\")\n\nqueue = mem_scheduler.memos_message_queue\n\n\n# 定义处理函数\ndef my_test_handler(messages: list[ScheduleMessageItem]):\n    print(f\"My test handler received {len(messages)} messages: {[one.item_id for one in messages]}\")\n    for msg in messages:\n        # 根据 task_id 创建文件（使用 item_id 作为数字 ID 0..99）\n        task_id = str(msg.item_id)\n        file_path = tmp_dir \u002F f\"{task_id}.txt\"\n        try:\n            sleep(5)\n            file_path.write_text(f\"Task {task_id} processed.\\n\")\n            print(f\"writing {file_path} done\")\n        except Exception as e:\n            print(f\"Failed to write {file_path}: {e}\")\n\n\ndef submit_tasks():\n    mem_scheduler.memos_message_queue.clear()\n\n    # 创建 100 条消息（task_id 0..99）\n    users = [\"user_A\", \"user_B\"]\n    messages_to_send = [\n        ScheduleMessageItem(\n            item_id=str(i),\n            user_id=users[i % 2],\n            mem_cube_id=\"test_mem_cube\",\n            label=TEST_HANDLER_LABEL,\n            content=f\"Create file for task {i}\",\n        )\n        for i in range(100)\n    ]\n    # 批量提交消息并打印完成信息\n    print(f\"Submitting {len(messages_to_send)} messages to the scheduler...\")\n    mem_scheduler.memos_message_queue.submit_messages(messages_to_send)\n    print(f\"Task submission done! tasks in queue: {mem_scheduler.get_tasks_status()}\")\n\n\n# 注册处理函数\nTEST_HANDLER_LABEL = \"test_handler\"\nmem_scheduler.register_handlers({TEST_HANDLER_LABEL: my_test_handler})\n\n# 5秒重启\nmem_scheduler.orchestrator.tasks_min_idle_ms[TEST_HANDLER_LABEL] = 5_000\n\ntmp_dir = Path(\".\u002Ftmp\")\ntmp_dir.mkdir(exist_ok=True)\n\n# 测试停止并重启：如果 tmp 中已有 >1 个文件，跳过提交并打印信息\nexisting_count = len(list(Path(\"tmp\").glob(\"*.txt\"))) if Path(\"tmp\").exists() else 0\nif existing_count > 1:\n    print(f\"Skip submission: found {existing_count} files in tmp (>1), continue processing\")\nelse:\n    submit_tasks()\n\n# 6. 等待直到 tmp 有 100 个文件或超时\npoll_interval = 1\nexpected = 100\ntmp_dir = Path(\"tmp\")\ntasks_status = mem_scheduler.get_tasks_status()\nmem_scheduler.print_tasks_status(tasks_status=tasks_status)\nwhile (\n    mem_scheduler.get_tasks_status()[\"remaining\"] != 0\n    or mem_scheduler.get_tasks_status()[\"running\"] != 0\n):\n    count = len(list(tmp_dir.glob(\"*.txt\"))) if tmp_dir.exists() else 0\n    tasks_status = mem_scheduler.get_tasks_status()\n    mem_scheduler.print_tasks_status(tasks_status=tasks_status)\n    print(f\"[Monitor] Files in tmp: {count}\u002F{expected}\")\n    sleep(poll_interval)\nprint(f\"[Result] Final files in tmp: {len(list(tmp_dir.glob('*.txt')))})\")\n\n# 7. 停止调度器\nsleep(20)\nprint(\"Stopping the scheduler...\")\nmem_scheduler.stop()\n",[69,4286,4287,4297,4309,4313,4335,4357,4361,4365,4370,4385,4414,4440,4466,4500,4552,4569,4573,4587,4591,4595,4600,4621,4676,4688,4693,4712,4739,4746,4757,4789,4812,4828,4859,4863,4867,4876,4891,4895,4900,4928,4937,4944,4961,4983,4998,5010,5032,5036,5055,5059,5064,5093,5111,5140,5144,5148,5153,5167,5186,5190,5195,5220,5224,5244,5262,5266,5271,5343,5357,5380,5387,5394,5398,5403,5413,5423,5441,5456,5476,5483,5508,5534,5538,5584,5599,5617,5648,5660,5704,5708,5713,5724,5739],{"__ignoreMap":178},[182,4288,4289,4291,4293,4295],{"class":184,"line":185},[182,4290,189],{"class":188},[182,4292,1906],{"class":192},[182,4294,203],{"class":188},[182,4296,1911],{"class":192},[182,4298,4299,4301,4304,4306],{"class":184,"line":209},[182,4300,189],{"class":188},[182,4302,4303],{"class":192}," time ",[182,4305,203],{"class":188},[182,4307,4308],{"class":192}," sleep\n",[182,4310,4311],{"class":184,"line":109},[182,4312,287],{"emptyLinePlaceholder":286},[182,4314,4315,4317,4319,4321,4323,4325,4327,4329,4331,4333],{"class":184,"line":257},[182,4316,189],{"class":188},[182,4318,193],{"class":192},[182,4320,197],{"class":196},[182,4322,218],{"class":192},[182,4324,197],{"class":196},[182,4326,1310],{"class":192},[182,4328,197],{"class":196},[182,4330,1315],{"class":192},[182,4332,203],{"class":188},[182,4334,1320],{"class":192},[182,4336,4337,4339,4341,4343,4345,4347,4349,4351,4353,4355],{"class":184,"line":283},[182,4338,189],{"class":188},[182,4340,193],{"class":192},[182,4342,197],{"class":196},[182,4344,244],{"class":192},[182,4346,197],{"class":196},[182,4348,1335],{"class":192},[182,4350,197],{"class":196},[182,4352,1340],{"class":192},[182,4354,203],{"class":188},[182,4356,1345],{"class":192},[182,4358,4359],{"class":184,"line":134},[182,4360,287],{"emptyLinePlaceholder":286},[182,4362,4363],{"class":184,"line":296},[182,4364,287],{"emptyLinePlaceholder":286},[182,4366,4367],{"class":184,"line":301},[182,4368,4369],{"class":292},"# 调试：打印调度器配置\n",[182,4371,4372,4374,4376,4378,4381,4383],{"class":184,"line":307},[182,4373,1732],{"class":327},[182,4375,361],{"class":196},[182,4377,429],{"class":196},[182,4379,4380],{"class":432},"=== Scheduler Configuration Debug ===",[182,4382,429],{"class":196},[182,4384,367],{"class":196},[182,4386,4387,4389,4391,4393,4396,4398,4400,4402,4404,4406,4408,4410,4412],{"class":184,"line":313},[182,4388,1732],{"class":327},[182,4390,361],{"class":196},[182,4392,1450],{"class":1387},[182,4394,4395],{"class":432},"\"Scheduler type: ",[182,4397,1457],{"class":1456},[182,4399,3921],{"class":1585},[182,4401,361],{"class":196},[182,4403,244],{"class":327},[182,4405,1943],{"class":196},[182,4407,2298],{"class":192},[182,4409,1468],{"class":1456},[182,4411,429],{"class":432},[182,4413,367],{"class":196},[182,4415,4416,4418,4420,4422,4425,4427,4429,4431,4434,4436,4438],{"class":184,"line":334},[182,4417,1732],{"class":327},[182,4419,361],{"class":196},[182,4421,1450],{"class":1387},[182,4423,4424],{"class":432},"\"Config: ",[182,4426,1457],{"class":1456},[182,4428,244],{"class":327},[182,4430,197],{"class":196},[182,4432,4433],{"class":1465},"config",[182,4435,1468],{"class":1456},[182,4437,429],{"class":432},[182,4439,367],{"class":196},[182,4441,4442,4444,4446,4448,4451,4453,4455,4457,4460,4462,4464],{"class":184,"line":339},[182,4443,1732],{"class":327},[182,4445,361],{"class":196},[182,4447,1450],{"class":1387},[182,4449,4450],{"class":432},"\"use_redis_queue: ",[182,4452,1457],{"class":1456},[182,4454,244],{"class":327},[182,4456,197],{"class":196},[182,4458,4459],{"class":1465},"use_redis_queue",[182,4461,1468],{"class":1456},[182,4463,429],{"class":432},[182,4465,367],{"class":196},[182,4467,4468,4470,4472,4474,4477,4479,4481,4483,4485,4487,4490,4492,4494,4496,4498],{"class":184,"line":345},[182,4469,1732],{"class":327},[182,4471,361],{"class":196},[182,4473,1450],{"class":1387},[182,4475,4476],{"class":432},"\"Queue type: ",[182,4478,1457],{"class":1456},[182,4480,3921],{"class":1585},[182,4482,361],{"class":196},[182,4484,244],{"class":327},[182,4486,197],{"class":196},[182,4488,4489],{"class":1465},"memos_message_queue",[182,4491,1943],{"class":196},[182,4493,2298],{"class":192},[182,4495,1468],{"class":1456},[182,4497,429],{"class":432},[182,4499,367],{"class":196},[182,4501,4502,4504,4506,4508,4511,4513,4516,4518,4520,4522,4524,4526,4529,4532,4535,4537,4539,4542,4544,4546,4548,4550],{"class":184,"line":370},[182,4503,1732],{"class":327},[182,4505,361],{"class":196},[182,4507,1450],{"class":1387},[182,4509,4510],{"class":432},"\"Queue maxsize: ",[182,4512,1457],{"class":1456},[182,4514,4515],{"class":327},"getattr",[182,4517,361],{"class":196},[182,4519,244],{"class":327},[182,4521,197],{"class":196},[182,4523,4489],{"class":1465},[182,4525,1995],{"class":196},[182,4527,4528],{"class":196}," '",[182,4530,4531],{"class":432},"maxsize",[182,4533,4534],{"class":196},"'",[182,4536,1995],{"class":196},[182,4538,4528],{"class":196},[182,4540,4541],{"class":432},"N\u002FA",[182,4543,4534],{"class":196},[182,4545,827],{"class":196},[182,4547,1468],{"class":1456},[182,4549,429],{"class":432},[182,4551,367],{"class":196},[182,4553,4554,4556,4558,4560,4563,4565,4567],{"class":184,"line":375},[182,4555,1732],{"class":327},[182,4557,361],{"class":196},[182,4559,429],{"class":196},[182,4561,4562],{"class":432},"=====================================",[182,4564,2403],{"class":192},[182,4566,429],{"class":196},[182,4568,367],{"class":196},[182,4570,4571],{"class":184,"line":381},[182,4572,287],{"emptyLinePlaceholder":286},[182,4574,4575,4578,4580,4582,4584],{"class":184,"line":387},[182,4576,4577],{"class":192},"queue ",[182,4579,319],{"class":196},[182,4581,2638],{"class":192},[182,4583,197],{"class":196},[182,4585,4586],{"class":1465},"memos_message_queue\n",[182,4588,4589],{"class":184,"line":393},[182,4590,287],{"emptyLinePlaceholder":286},[182,4592,4593],{"class":184,"line":398},[182,4594,287],{"emptyLinePlaceholder":286},[182,4596,4597],{"class":184,"line":404},[182,4598,4599],{"class":292},"# 定义处理函数\n",[182,4601,4602,4604,4607,4609,4611,4613,4615,4617,4619],{"class":184,"line":410},[182,4603,1388],{"class":1387},[182,4605,4606],{"class":327}," my_test_handler",[182,4608,361],{"class":196},[182,4610,1397],{"class":1396},[182,4612,415],{"class":196},[182,4614,1402],{"class":192},[182,4616,426],{"class":196},[182,4618,721],{"class":192},[182,4620,1409],{"class":196},[182,4622,4623,4625,4627,4629,4632,4634,4637,4639,4641,4643,4645,4648,4650,4652,4655,4657,4659,4661,4664,4666,4668,4670,4672,4674],{"class":184,"line":440},[182,4624,3244],{"class":327},[182,4626,361],{"class":196},[182,4628,1450],{"class":1387},[182,4630,4631],{"class":432},"\"My test handler received ",[182,4633,1457],{"class":1456},[182,4635,4636],{"class":327},"len",[182,4638,361],{"class":196},[182,4640,1397],{"class":327},[182,4642,827],{"class":196},[182,4644,1468],{"class":1456},[182,4646,4647],{"class":432}," messages: ",[182,4649,1457],{"class":1456},[182,4651,426],{"class":196},[182,4653,4654],{"class":327},"one",[182,4656,197],{"class":196},[182,4658,765],{"class":1465},[182,4660,3680],{"class":188},[182,4662,4663],{"class":327}," one ",[182,4665,1434],{"class":188},[182,4667,1437],{"class":327},[182,4669,2037],{"class":196},[182,4671,1468],{"class":1456},[182,4673,429],{"class":432},[182,4675,367],{"class":196},[182,4677,4678,4680,4682,4684,4686],{"class":184,"line":445},[182,4679,1428],{"class":188},[182,4681,1431],{"class":192},[182,4683,1434],{"class":188},[182,4685,1437],{"class":192},[182,4687,1440],{"class":196},[182,4689,4690],{"class":184,"line":451},[182,4691,4692],{"class":292},"        # 根据 task_id 创建文件（使用 item_id 作为数字 ID 0..99）\n",[182,4694,4695,4698,4700,4702,4704,4706,4708,4710],{"class":184,"line":457},[182,4696,4697],{"class":192},"        task_id ",[182,4699,319],{"class":196},[182,4701,1998],{"class":1585},[182,4703,361],{"class":196},[182,4705,1460],{"class":327},[182,4707,197],{"class":196},[182,4709,765],{"class":1465},[182,4711,367],{"class":196},[182,4713,4714,4717,4719,4722,4725,4728,4730,4732,4734,4736],{"class":184,"line":478},[182,4715,4716],{"class":192},"        file_path ",[182,4718,319],{"class":196},[182,4720,4721],{"class":192}," tmp_dir ",[182,4723,4724],{"class":196},"\u002F",[182,4726,4727],{"class":1387}," f",[182,4729,429],{"class":432},[182,4731,1457],{"class":1456},[182,4733,923],{"class":192},[182,4735,1468],{"class":1456},[182,4737,4738],{"class":432},".txt\"\n",[182,4740,4741,4744],{"class":184,"line":1535},[182,4742,4743],{"class":188},"        try",[182,4745,1440],{"class":196},[182,4747,4748,4751,4753,4755],{"class":184,"line":1546},[182,4749,4750],{"class":327},"            sleep",[182,4752,361],{"class":196},[182,4754,2810],{"class":1456},[182,4756,367],{"class":196},[182,4758,4759,4762,4764,4767,4769,4771,4774,4776,4778,4780,4783,4785,4787],{"class":184,"line":1552},[182,4760,4761],{"class":192},"            file_path",[182,4763,197],{"class":196},[182,4765,4766],{"class":327},"write_text",[182,4768,361],{"class":196},[182,4770,1450],{"class":1387},[182,4772,4773],{"class":432},"\"Task ",[182,4775,1457],{"class":1456},[182,4777,923],{"class":327},[182,4779,1468],{"class":1456},[182,4781,4782],{"class":432}," processed.",[182,4784,2403],{"class":192},[182,4786,429],{"class":432},[182,4788,367],{"class":196},[182,4790,4791,4793,4795,4797,4800,4802,4805,4807,4810],{"class":184,"line":1557},[182,4792,2849],{"class":327},[182,4794,361],{"class":196},[182,4796,1450],{"class":1387},[182,4798,4799],{"class":432},"\"writing ",[182,4801,1457],{"class":1456},[182,4803,4804],{"class":327},"file_path",[182,4806,1468],{"class":1456},[182,4808,4809],{"class":432}," done\"",[182,4811,367],{"class":196},[182,4813,4814,4817,4820,4823,4826],{"class":184,"line":1563},[182,4815,4816],{"class":188},"        except",[182,4818,4819],{"class":1585}," Exception",[182,4821,4822],{"class":188}," as",[182,4824,4825],{"class":192}," e",[182,4827,1440],{"class":196},[182,4829,4830,4832,4834,4836,4839,4841,4843,4845,4848,4850,4853,4855,4857],{"class":184,"line":1577},[182,4831,2849],{"class":327},[182,4833,361],{"class":196},[182,4835,1450],{"class":1387},[182,4837,4838],{"class":432},"\"Failed to write ",[182,4840,1457],{"class":1456},[182,4842,4804],{"class":327},[182,4844,1468],{"class":1456},[182,4846,4847],{"class":432},": ",[182,4849,1457],{"class":1456},[182,4851,4852],{"class":327},"e",[182,4854,1468],{"class":1456},[182,4856,429],{"class":432},[182,4858,367],{"class":196},[182,4860,4861],{"class":184,"line":1601},[182,4862,287],{"emptyLinePlaceholder":286},[182,4864,4865],{"class":184,"line":1619},[182,4866,287],{"emptyLinePlaceholder":286},[182,4868,4869,4871,4874],{"class":184,"line":1636},[182,4870,1388],{"class":1387},[182,4872,4873],{"class":327}," submit_tasks",[182,4875,2908],{"class":196},[182,4877,4878,4880,4882,4884,4886,4889],{"class":184,"line":1649},[182,4879,2191],{"class":192},[182,4881,197],{"class":196},[182,4883,4489],{"class":1465},[182,4885,197],{"class":196},[182,4887,4888],{"class":327},"clear",[182,4890,331],{"class":196},[182,4892,4893],{"class":184,"line":1666},[182,4894,287],{"emptyLinePlaceholder":286},[182,4896,4897],{"class":184,"line":1683},[182,4898,4899],{"class":292},"    # 创建 100 条消息（task_id 0..99）\n",[182,4901,4902,4905,4907,4910,4912,4915,4917,4919,4921,4924,4926],{"class":184,"line":1688},[182,4903,4904],{"class":192},"    users ",[182,4906,319],{"class":196},[182,4908,4909],{"class":196}," [",[182,4911,429],{"class":196},[182,4913,4914],{"class":432},"user_A",[182,4916,429],{"class":196},[182,4918,1995],{"class":196},[182,4920,1364],{"class":196},[182,4922,4923],{"class":432},"user_B",[182,4925,429],{"class":196},[182,4927,437],{"class":196},[182,4929,4930,4933,4935],{"class":184,"line":1693},[182,4931,4932],{"class":192},"    messages_to_send ",[182,4934,319],{"class":196},[182,4936,2931],{"class":196},[182,4938,4939,4942],{"class":184,"line":1699},[182,4940,4941],{"class":327},"        ScheduleMessageItem",[182,4943,1574],{"class":196},[182,4945,4946,4949,4951,4953,4955,4958],{"class":184,"line":1705},[182,4947,4948],{"class":1396},"            item_id",[182,4950,319],{"class":196},[182,4952,770],{"class":1585},[182,4954,361],{"class":196},[182,4956,4957],{"class":327},"i",[182,4959,4960],{"class":196},"),\n",[182,4962,4963,4965,4967,4970,4972,4975,4978,4981],{"class":184,"line":1724},[182,4964,2672],{"class":1396},[182,4966,319],{"class":196},[182,4968,4969],{"class":327},"users",[182,4971,426],{"class":196},[182,4973,4974],{"class":327},"i ",[182,4976,4977],{"class":196},"%",[182,4979,4980],{"class":1456}," 2",[182,4982,3379],{"class":196},[182,4984,4985,4987,4989,4991,4994,4996],{"class":184,"line":1729},[182,4986,2688],{"class":1396},[182,4988,319],{"class":196},[182,4990,429],{"class":196},[182,4992,4993],{"class":432},"test_mem_cube",[182,4995,429],{"class":196},[182,4997,1616],{"class":196},[182,4999,5000,5003,5005,5008],{"class":184,"line":1756},[182,5001,5002],{"class":1396},"            label",[182,5004,319],{"class":196},[182,5006,5007],{"class":327},"TEST_HANDLER_LABEL",[182,5009,1616],{"class":196},[182,5011,5012,5015,5017,5019,5022,5024,5026,5028,5030],{"class":184,"line":1761},[182,5013,5014],{"class":1396},"            content",[182,5016,319],{"class":196},[182,5018,1450],{"class":1387},[182,5020,5021],{"class":432},"\"Create file for task ",[182,5023,1457],{"class":1456},[182,5025,4957],{"class":327},[182,5027,1468],{"class":1456},[182,5029,429],{"class":432},[182,5031,1616],{"class":196},[182,5033,5034],{"class":184,"line":1767},[182,5035,2764],{"class":196},[182,5037,5038,5040,5043,5045,5048,5050,5053],{"class":184,"line":2379},[182,5039,2827],{"class":188},[182,5041,5042],{"class":192}," i ",[182,5044,1434],{"class":188},[182,5046,5047],{"class":327}," range",[182,5049,361],{"class":196},[182,5051,5052],{"class":1456},"100",[182,5054,367],{"class":196},[182,5056,5057],{"class":184,"line":2392},[182,5058,3094],{"class":196},[182,5060,5061],{"class":184,"line":2423},[182,5062,5063],{"class":292},"    # 批量提交消息并打印完成信息\n",[182,5065,5066,5068,5070,5072,5075,5077,5079,5081,5084,5086,5088,5091],{"class":184,"line":2429},[182,5067,3244],{"class":327},[182,5069,361],{"class":196},[182,5071,1450],{"class":1387},[182,5073,5074],{"class":432},"\"Submitting ",[182,5076,1457],{"class":1456},[182,5078,4636],{"class":327},[182,5080,361],{"class":196},[182,5082,5083],{"class":327},"messages_to_send",[182,5085,827],{"class":196},[182,5087,1468],{"class":1456},[182,5089,5090],{"class":432}," messages to the scheduler...\"",[182,5092,367],{"class":196},[182,5094,5095,5097,5099,5101,5103,5105,5107,5109],{"class":184,"line":2435},[182,5096,2191],{"class":192},[182,5098,197],{"class":196},[182,5100,4489],{"class":1465},[182,5102,197],{"class":196},[182,5104,1712],{"class":327},[182,5106,361],{"class":196},[182,5108,5083],{"class":327},[182,5110,367],{"class":196},[182,5112,5113,5115,5117,5119,5122,5124,5126,5128,5131,5134,5136,5138],{"class":184,"line":2472},[182,5114,3244],{"class":327},[182,5116,361],{"class":196},[182,5118,1450],{"class":1387},[182,5120,5121],{"class":432},"\"Task submission done! tasks in queue: ",[182,5123,1457],{"class":1456},[182,5125,244],{"class":327},[182,5127,197],{"class":196},[182,5129,5130],{"class":327},"get_tasks_status",[182,5132,5133],{"class":196},"()",[182,5135,1468],{"class":1456},[182,5137,429],{"class":432},[182,5139,367],{"class":196},[182,5141,5142],{"class":184,"line":2477},[182,5143,287],{"emptyLinePlaceholder":286},[182,5145,5146],{"class":184,"line":2483},[182,5147,287],{"emptyLinePlaceholder":286},[182,5149,5150],{"class":184,"line":2500},[182,5151,5152],{"class":292},"# 注册处理函数\n",[182,5154,5155,5158,5160,5162,5165],{"class":184,"line":2505},[182,5156,5157],{"class":192},"TEST_HANDLER_LABEL ",[182,5159,319],{"class":196},[182,5161,1364],{"class":196},[182,5163,5164],{"class":432},"test_handler",[182,5166,1369],{"class":196},[182,5168,5169,5171,5173,5175,5178,5180,5182,5184],{"class":184,"line":2510},[182,5170,244],{"class":192},[182,5172,197],{"class":196},[182,5174,1529],{"class":327},[182,5176,5177],{"class":196},"({",[182,5179,5007],{"class":327},[182,5181,415],{"class":196},[182,5183,4606],{"class":327},[182,5185,1549],{"class":196},[182,5187,5188],{"class":184,"line":2532},[182,5189,287],{"emptyLinePlaceholder":286},[182,5191,5192],{"class":184,"line":2537},[182,5193,5194],{"class":292},"# 5秒重启\n",[182,5196,5197,5199,5201,5204,5206,5209,5211,5213,5215,5217],{"class":184,"line":2543},[182,5198,244],{"class":192},[182,5200,197],{"class":196},[182,5202,5203],{"class":1465},"orchestrator",[182,5205,197],{"class":196},[182,5207,5208],{"class":1465},"tasks_min_idle_ms",[182,5210,426],{"class":196},[182,5212,5007],{"class":1465},[182,5214,2037],{"class":196},[182,5216,2040],{"class":196},[182,5218,5219],{"class":1456}," 5_000\n",[182,5221,5222],{"class":184,"line":2549},[182,5223,287],{"emptyLinePlaceholder":286},[182,5225,5226,5229,5231,5233,5235,5237,5240,5242],{"class":184,"line":2555},[182,5227,5228],{"class":192},"tmp_dir ",[182,5230,319],{"class":196},[182,5232,1935],{"class":327},[182,5234,361],{"class":196},[182,5236,429],{"class":196},[182,5238,5239],{"class":432},".\u002Ftmp",[182,5241,429],{"class":196},[182,5243,367],{"class":196},[182,5245,5246,5249,5251,5254,5256,5259],{"class":184,"line":2560},[182,5247,5248],{"class":192},"tmp_dir",[182,5250,197],{"class":196},[182,5252,5253],{"class":327},"mkdir",[182,5255,361],{"class":196},[182,5257,5258],{"class":1396},"exist_ok",[182,5260,5261],{"class":196},"=True)\n",[182,5263,5264],{"class":184,"line":2569},[182,5265,287],{"emptyLinePlaceholder":286},[182,5267,5268],{"class":184,"line":2580},[182,5269,5270],{"class":292},"# 测试停止并重启：如果 tmp 中已有 >1 个文件，跳过提交并打印信息\n",[182,5272,5273,5276,5278,5281,5283,5286,5288,5291,5293,5295,5298,5300,5302,5305,5307,5309,5312,5314,5317,5320,5322,5324,5326,5328,5330,5332,5335,5337,5340],{"class":184,"line":2591},[182,5274,5275],{"class":192},"existing_count ",[182,5277,319],{"class":196},[182,5279,5280],{"class":327}," len",[182,5282,361],{"class":196},[182,5284,5285],{"class":1585},"list",[182,5287,361],{"class":196},[182,5289,5290],{"class":327},"Path",[182,5292,361],{"class":196},[182,5294,429],{"class":196},[182,5296,5297],{"class":432},"tmp",[182,5299,429],{"class":196},[182,5301,1943],{"class":196},[182,5303,5304],{"class":327},"glob",[182,5306,361],{"class":196},[182,5308,429],{"class":196},[182,5310,5311],{"class":432},"*.txt",[182,5313,429],{"class":196},[182,5315,5316],{"class":196},")))",[182,5318,5319],{"class":188}," if",[182,5321,1935],{"class":327},[182,5323,361],{"class":196},[182,5325,429],{"class":196},[182,5327,5297],{"class":432},[182,5329,429],{"class":196},[182,5331,1943],{"class":196},[182,5333,5334],{"class":327},"exists",[182,5336,5133],{"class":196},[182,5338,5339],{"class":188}," else",[182,5341,5342],{"class":1456}," 0\n",[182,5344,5345,5347,5350,5353,5355],{"class":184,"line":2597},[182,5346,4040],{"class":188},[182,5348,5349],{"class":192}," existing_count ",[182,5351,5352],{"class":196},">",[182,5354,3810],{"class":1456},[182,5356,1440],{"class":196},[182,5358,5359,5361,5363,5365,5368,5370,5373,5375,5378],{"class":184,"line":2610},[182,5360,3244],{"class":327},[182,5362,361],{"class":196},[182,5364,1450],{"class":1387},[182,5366,5367],{"class":432},"\"Skip submission: found ",[182,5369,1457],{"class":1456},[182,5371,5372],{"class":327},"existing_count",[182,5374,1468],{"class":1456},[182,5376,5377],{"class":432}," files in tmp (>1), continue processing\"",[182,5379,367],{"class":196},[182,5381,5382,5385],{"class":184,"line":2624},[182,5383,5384],{"class":188},"else",[182,5386,1440],{"class":196},[182,5388,5389,5392],{"class":184,"line":2630},[182,5390,5391],{"class":327},"    submit_tasks",[182,5393,331],{"class":196},[182,5395,5396],{"class":184,"line":2653},[182,5397,287],{"emptyLinePlaceholder":286},[182,5399,5400],{"class":184,"line":2669},[182,5401,5402],{"class":292},"# 6. 等待直到 tmp 有 100 个文件或超时\n",[182,5404,5405,5408,5410],{"class":184,"line":2685},[182,5406,5407],{"class":192},"poll_interval ",[182,5409,319],{"class":196},[182,5411,5412],{"class":1456}," 1\n",[182,5414,5415,5418,5420],{"class":184,"line":2701},[182,5416,5417],{"class":192},"expected ",[182,5419,319],{"class":196},[182,5421,5422],{"class":1456}," 100\n",[182,5424,5425,5427,5429,5431,5433,5435,5437,5439],{"class":184,"line":2718},[182,5426,5228],{"class":192},[182,5428,319],{"class":196},[182,5430,1935],{"class":327},[182,5432,361],{"class":196},[182,5434,429],{"class":196},[182,5436,5297],{"class":432},[182,5438,429],{"class":196},[182,5440,367],{"class":196},[182,5442,5443,5446,5448,5450,5452,5454],{"class":184,"line":2731},[182,5444,5445],{"class":192},"tasks_status ",[182,5447,319],{"class":196},[182,5449,2638],{"class":192},[182,5451,197],{"class":196},[182,5453,5130],{"class":327},[182,5455,331],{"class":196},[182,5457,5458,5460,5462,5465,5467,5470,5472,5474],{"class":184,"line":2748},[182,5459,244],{"class":192},[182,5461,197],{"class":196},[182,5463,5464],{"class":327},"print_tasks_status",[182,5466,361],{"class":196},[182,5468,5469],{"class":1396},"tasks_status",[182,5471,319],{"class":196},[182,5473,5469],{"class":327},[182,5475,367],{"class":196},[182,5477,5478,5481],{"class":184,"line":2761},[182,5479,5480],{"class":188},"while",[182,5482,2172],{"class":196},[182,5484,5485,5487,5489,5491,5494,5496,5499,5501,5503,5506],{"class":184,"line":2767},[182,5486,2191],{"class":192},[182,5488,197],{"class":196},[182,5490,5130],{"class":327},[182,5492,5493],{"class":196},"()[",[182,5495,429],{"class":196},[182,5497,5498],{"class":432},"remaining",[182,5500,429],{"class":196},[182,5502,2037],{"class":196},[182,5504,5505],{"class":196}," !=",[182,5507,5342],{"class":1456},[182,5509,5510,5513,5515,5517,5519,5521,5523,5526,5528,5530,5532],{"class":184,"line":2772},[182,5511,5512],{"class":196},"    or",[182,5514,2638],{"class":192},[182,5516,197],{"class":196},[182,5518,5130],{"class":327},[182,5520,5493],{"class":196},[182,5522,429],{"class":196},[182,5524,5525],{"class":432},"running",[182,5527,429],{"class":196},[182,5529,2037],{"class":196},[182,5531,5505],{"class":196},[182,5533,5342],{"class":1456},[182,5535,5536],{"class":184,"line":2778},[182,5537,3717],{"class":196},[182,5539,5540,5543,5545,5547,5549,5551,5553,5555,5557,5559,5561,5563,5565,5567,5569,5571,5574,5576,5578,5580,5582],{"class":184,"line":2796},[182,5541,5542],{"class":192},"    count ",[182,5544,319],{"class":196},[182,5546,5280],{"class":327},[182,5548,361],{"class":196},[182,5550,5285],{"class":1585},[182,5552,361],{"class":196},[182,5554,5248],{"class":327},[182,5556,197],{"class":196},[182,5558,5304],{"class":327},[182,5560,361],{"class":196},[182,5562,429],{"class":196},[182,5564,5311],{"class":432},[182,5566,429],{"class":196},[182,5568,5316],{"class":196},[182,5570,5319],{"class":188},[182,5572,5573],{"class":192}," tmp_dir",[182,5575,197],{"class":196},[182,5577,5334],{"class":327},[182,5579,5133],{"class":196},[182,5581,5339],{"class":188},[182,5583,5342],{"class":1456},[182,5585,5586,5589,5591,5593,5595,5597],{"class":184,"line":2819},[182,5587,5588],{"class":192},"    tasks_status ",[182,5590,319],{"class":196},[182,5592,2638],{"class":192},[182,5594,197],{"class":196},[182,5596,5130],{"class":327},[182,5598,331],{"class":196},[182,5600,5601,5603,5605,5607,5609,5611,5613,5615],{"class":184,"line":2824},[182,5602,2191],{"class":192},[182,5604,197],{"class":196},[182,5606,5464],{"class":327},[182,5608,361],{"class":196},[182,5610,5469],{"class":1396},[182,5612,319],{"class":196},[182,5614,5469],{"class":327},[182,5616,367],{"class":196},[182,5618,5619,5621,5623,5625,5628,5630,5633,5635,5637,5639,5642,5644,5646],{"class":184,"line":2840},[182,5620,3244],{"class":327},[182,5622,361],{"class":196},[182,5624,1450],{"class":1387},[182,5626,5627],{"class":432},"\"[Monitor] Files in tmp: ",[182,5629,1457],{"class":1456},[182,5631,5632],{"class":327},"count",[182,5634,1468],{"class":1456},[182,5636,4724],{"class":432},[182,5638,1457],{"class":1456},[182,5640,5641],{"class":327},"expected",[182,5643,1468],{"class":1456},[182,5645,429],{"class":432},[182,5647,367],{"class":196},[182,5649,5650,5653,5655,5658],{"class":184,"line":2846},[182,5651,5652],{"class":327},"    sleep",[182,5654,361],{"class":196},[182,5656,5657],{"class":327},"poll_interval",[182,5659,367],{"class":196},[182,5661,5662,5664,5666,5668,5671,5673,5675,5677,5679,5681,5683,5685,5687,5689,5691,5693,5695,5697,5699,5702],{"class":184,"line":2884},[182,5663,1732],{"class":327},[182,5665,361],{"class":196},[182,5667,1450],{"class":1387},[182,5669,5670],{"class":432},"\"[Result] Final files in tmp: ",[182,5672,1457],{"class":1456},[182,5674,4636],{"class":327},[182,5676,361],{"class":196},[182,5678,5285],{"class":1585},[182,5680,361],{"class":196},[182,5682,5248],{"class":327},[182,5684,197],{"class":196},[182,5686,5304],{"class":327},[182,5688,361],{"class":196},[182,5690,4534],{"class":196},[182,5692,5311],{"class":432},[182,5694,4534],{"class":196},[182,5696,5316],{"class":196},[182,5698,1468],{"class":1456},[182,5700,5701],{"class":432},")\"",[182,5703,367],{"class":196},[182,5705,5706],{"class":184,"line":2889},[182,5707,287],{"emptyLinePlaceholder":286},[182,5709,5710],{"class":184,"line":2895},[182,5711,5712],{"class":292},"# 7. 停止调度器\n",[182,5714,5715,5717,5719,5722],{"class":184,"line":2900},[182,5716,1775],{"class":327},[182,5718,361],{"class":196},[182,5720,5721],{"class":1456},"20",[182,5723,367],{"class":196},[182,5725,5726,5728,5730,5732,5735,5737],{"class":184,"line":2911},[182,5727,1732],{"class":327},[182,5729,361],{"class":196},[182,5731,429],{"class":196},[182,5733,5734],{"class":432},"Stopping the scheduler...",[182,5736,429],{"class":196},[182,5738,367],{"class":196},[182,5740,5741,5743,5745,5747],{"class":184,"line":2923},[182,5742,244],{"class":192},[182,5744,197],{"class":196},[182,5746,4272],{"class":327},[182,5748,331],{"class":196},[5750,5751,5752],"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 pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}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 .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}",{"title":178,"searchDepth":209,"depth":209,"links":5754},[5755,5756,5761,5764,5769,5773],{"id":13,"depth":209,"text":13},{"id":63,"depth":209,"text":64,"children":5757},[5758,5759,5760],{"id":75,"depth":109,"text":76},{"id":105,"depth":109,"text":106},{"id":130,"depth":109,"text":131},{"id":149,"depth":209,"text":150,"children":5762},[5763],{"id":159,"depth":109,"text":160},{"id":483,"depth":209,"text":483,"children":5765},[5766,5767,5768],{"id":489,"depth":109,"text":489},{"id":714,"depth":109,"text":715},{"id":975,"depth":109,"text":976},{"id":1246,"depth":209,"text":1246,"children":5770},[5771,5772],{"id":1249,"depth":109,"text":1250},{"id":1785,"depth":109,"text":1786},{"id":1852,"depth":209,"text":1852,"children":5774},[5775,5776],{"id":1855,"depth":109,"text":1856},{"id":4277,"depth":109,"text":4278},"MemScheduler 是你的“记忆组织调度器”，它在后台异步管理记忆的流转和更新，协调工作记忆、长时记忆和激活记忆之间的交互，让对话系统能够动态地组织和利用记忆。","md",{},"\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler",{"title":5,"description":178},"cn\u002Fopen_source\u002Fmodules\u002Fmem_scheduler","BxS-074t9h4jIMRr_TxT20MYQJrqG9XMZNd99jNGSd0",[5785,5793],{"title":5786,"path":5787,"stem":5788,"icon":5789,"framework":6,"module":6,"class":5790,"target":-1,"active":5791,"defaultOpen":5791,"children":-1,"description":5792},"MemReader 记忆读取","\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_reader","open_source\u002Fmodules\u002Fmem_reader","i-ri-book-open-line",[],false,"“MemReader 是你的“记忆翻译官”。它负责把杂乱的输入（聊天、文档、图片）翻译成系统能理解的、结构化的记忆片段。\"",{"title":5794,"path":5795,"stem":5796,"icon":5797,"framework":6,"module":6,"class":5798,"target":-1,"active":5791,"defaultOpen":5791,"children":-1,"description":5799},"MemChat 使用记忆进行聊天","\u002Fcn\u002Fopen_source\u002Fmodules\u002Fmem_chat","open_source\u002Fmodules\u002Fmem_chat","i-ri-calendar-line",[],"MemChat 是你的“记忆外交官”，它协调用户输入、记忆检索与 LLM 生成，打造连贯且具备长期记忆的对话体验。",1774339750919]