MemoryOS 2.0.3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. memoryos-2.0.3.dist-info/METADATA +418 -0
  2. memoryos-2.0.3.dist-info/RECORD +315 -0
  3. memoryos-2.0.3.dist-info/WHEEL +4 -0
  4. memoryos-2.0.3.dist-info/entry_points.txt +3 -0
  5. memoryos-2.0.3.dist-info/licenses/LICENSE +201 -0
  6. memos/__init__.py +20 -0
  7. memos/api/client.py +571 -0
  8. memos/api/config.py +1018 -0
  9. memos/api/context/dependencies.py +50 -0
  10. memos/api/exceptions.py +53 -0
  11. memos/api/handlers/__init__.py +62 -0
  12. memos/api/handlers/add_handler.py +158 -0
  13. memos/api/handlers/base_handler.py +194 -0
  14. memos/api/handlers/chat_handler.py +1401 -0
  15. memos/api/handlers/component_init.py +388 -0
  16. memos/api/handlers/config_builders.py +190 -0
  17. memos/api/handlers/feedback_handler.py +93 -0
  18. memos/api/handlers/formatters_handler.py +237 -0
  19. memos/api/handlers/memory_handler.py +316 -0
  20. memos/api/handlers/scheduler_handler.py +497 -0
  21. memos/api/handlers/search_handler.py +222 -0
  22. memos/api/handlers/suggestion_handler.py +117 -0
  23. memos/api/mcp_serve.py +614 -0
  24. memos/api/middleware/request_context.py +101 -0
  25. memos/api/product_api.py +38 -0
  26. memos/api/product_models.py +1206 -0
  27. memos/api/routers/__init__.py +1 -0
  28. memos/api/routers/product_router.py +477 -0
  29. memos/api/routers/server_router.py +394 -0
  30. memos/api/server_api.py +44 -0
  31. memos/api/start_api.py +433 -0
  32. memos/chunkers/__init__.py +4 -0
  33. memos/chunkers/base.py +24 -0
  34. memos/chunkers/charactertext_chunker.py +41 -0
  35. memos/chunkers/factory.py +24 -0
  36. memos/chunkers/markdown_chunker.py +62 -0
  37. memos/chunkers/sentence_chunker.py +54 -0
  38. memos/chunkers/simple_chunker.py +50 -0
  39. memos/cli.py +113 -0
  40. memos/configs/__init__.py +0 -0
  41. memos/configs/base.py +82 -0
  42. memos/configs/chunker.py +59 -0
  43. memos/configs/embedder.py +88 -0
  44. memos/configs/graph_db.py +236 -0
  45. memos/configs/internet_retriever.py +100 -0
  46. memos/configs/llm.py +151 -0
  47. memos/configs/mem_agent.py +54 -0
  48. memos/configs/mem_chat.py +81 -0
  49. memos/configs/mem_cube.py +105 -0
  50. memos/configs/mem_os.py +83 -0
  51. memos/configs/mem_reader.py +91 -0
  52. memos/configs/mem_scheduler.py +385 -0
  53. memos/configs/mem_user.py +70 -0
  54. memos/configs/memory.py +324 -0
  55. memos/configs/parser.py +38 -0
  56. memos/configs/reranker.py +18 -0
  57. memos/configs/utils.py +8 -0
  58. memos/configs/vec_db.py +80 -0
  59. memos/context/context.py +355 -0
  60. memos/dependency.py +52 -0
  61. memos/deprecation.py +262 -0
  62. memos/embedders/__init__.py +0 -0
  63. memos/embedders/ark.py +95 -0
  64. memos/embedders/base.py +106 -0
  65. memos/embedders/factory.py +29 -0
  66. memos/embedders/ollama.py +77 -0
  67. memos/embedders/sentence_transformer.py +49 -0
  68. memos/embedders/universal_api.py +51 -0
  69. memos/exceptions.py +30 -0
  70. memos/graph_dbs/__init__.py +0 -0
  71. memos/graph_dbs/base.py +274 -0
  72. memos/graph_dbs/factory.py +27 -0
  73. memos/graph_dbs/item.py +46 -0
  74. memos/graph_dbs/nebular.py +1794 -0
  75. memos/graph_dbs/neo4j.py +1942 -0
  76. memos/graph_dbs/neo4j_community.py +1058 -0
  77. memos/graph_dbs/polardb.py +5446 -0
  78. memos/hello_world.py +97 -0
  79. memos/llms/__init__.py +0 -0
  80. memos/llms/base.py +25 -0
  81. memos/llms/deepseek.py +13 -0
  82. memos/llms/factory.py +38 -0
  83. memos/llms/hf.py +443 -0
  84. memos/llms/hf_singleton.py +114 -0
  85. memos/llms/ollama.py +135 -0
  86. memos/llms/openai.py +222 -0
  87. memos/llms/openai_new.py +198 -0
  88. memos/llms/qwen.py +13 -0
  89. memos/llms/utils.py +14 -0
  90. memos/llms/vllm.py +218 -0
  91. memos/log.py +237 -0
  92. memos/mem_agent/base.py +19 -0
  93. memos/mem_agent/deepsearch_agent.py +391 -0
  94. memos/mem_agent/factory.py +36 -0
  95. memos/mem_chat/__init__.py +0 -0
  96. memos/mem_chat/base.py +30 -0
  97. memos/mem_chat/factory.py +21 -0
  98. memos/mem_chat/simple.py +200 -0
  99. memos/mem_cube/__init__.py +0 -0
  100. memos/mem_cube/base.py +30 -0
  101. memos/mem_cube/general.py +240 -0
  102. memos/mem_cube/navie.py +172 -0
  103. memos/mem_cube/utils.py +169 -0
  104. memos/mem_feedback/base.py +15 -0
  105. memos/mem_feedback/feedback.py +1192 -0
  106. memos/mem_feedback/simple_feedback.py +40 -0
  107. memos/mem_feedback/utils.py +230 -0
  108. memos/mem_os/client.py +5 -0
  109. memos/mem_os/core.py +1203 -0
  110. memos/mem_os/main.py +582 -0
  111. memos/mem_os/product.py +1608 -0
  112. memos/mem_os/product_server.py +455 -0
  113. memos/mem_os/utils/default_config.py +359 -0
  114. memos/mem_os/utils/format_utils.py +1403 -0
  115. memos/mem_os/utils/reference_utils.py +162 -0
  116. memos/mem_reader/__init__.py +0 -0
  117. memos/mem_reader/base.py +47 -0
  118. memos/mem_reader/factory.py +53 -0
  119. memos/mem_reader/memory.py +298 -0
  120. memos/mem_reader/multi_modal_struct.py +965 -0
  121. memos/mem_reader/read_multi_modal/__init__.py +43 -0
  122. memos/mem_reader/read_multi_modal/assistant_parser.py +311 -0
  123. memos/mem_reader/read_multi_modal/base.py +273 -0
  124. memos/mem_reader/read_multi_modal/file_content_parser.py +826 -0
  125. memos/mem_reader/read_multi_modal/image_parser.py +359 -0
  126. memos/mem_reader/read_multi_modal/multi_modal_parser.py +252 -0
  127. memos/mem_reader/read_multi_modal/string_parser.py +139 -0
  128. memos/mem_reader/read_multi_modal/system_parser.py +327 -0
  129. memos/mem_reader/read_multi_modal/text_content_parser.py +131 -0
  130. memos/mem_reader/read_multi_modal/tool_parser.py +210 -0
  131. memos/mem_reader/read_multi_modal/user_parser.py +218 -0
  132. memos/mem_reader/read_multi_modal/utils.py +358 -0
  133. memos/mem_reader/simple_struct.py +912 -0
  134. memos/mem_reader/strategy_struct.py +163 -0
  135. memos/mem_reader/utils.py +157 -0
  136. memos/mem_scheduler/__init__.py +0 -0
  137. memos/mem_scheduler/analyzer/__init__.py +0 -0
  138. memos/mem_scheduler/analyzer/api_analyzer.py +714 -0
  139. memos/mem_scheduler/analyzer/eval_analyzer.py +219 -0
  140. memos/mem_scheduler/analyzer/mos_for_test_scheduler.py +571 -0
  141. memos/mem_scheduler/analyzer/scheduler_for_eval.py +280 -0
  142. memos/mem_scheduler/base_scheduler.py +1319 -0
  143. memos/mem_scheduler/general_modules/__init__.py +0 -0
  144. memos/mem_scheduler/general_modules/api_misc.py +137 -0
  145. memos/mem_scheduler/general_modules/base.py +80 -0
  146. memos/mem_scheduler/general_modules/init_components_for_scheduler.py +425 -0
  147. memos/mem_scheduler/general_modules/misc.py +313 -0
  148. memos/mem_scheduler/general_modules/scheduler_logger.py +389 -0
  149. memos/mem_scheduler/general_modules/task_threads.py +315 -0
  150. memos/mem_scheduler/general_scheduler.py +1495 -0
  151. memos/mem_scheduler/memory_manage_modules/__init__.py +5 -0
  152. memos/mem_scheduler/memory_manage_modules/memory_filter.py +306 -0
  153. memos/mem_scheduler/memory_manage_modules/retriever.py +547 -0
  154. memos/mem_scheduler/monitors/__init__.py +0 -0
  155. memos/mem_scheduler/monitors/dispatcher_monitor.py +366 -0
  156. memos/mem_scheduler/monitors/general_monitor.py +394 -0
  157. memos/mem_scheduler/monitors/task_schedule_monitor.py +254 -0
  158. memos/mem_scheduler/optimized_scheduler.py +410 -0
  159. memos/mem_scheduler/orm_modules/__init__.py +0 -0
  160. memos/mem_scheduler/orm_modules/api_redis_model.py +518 -0
  161. memos/mem_scheduler/orm_modules/base_model.py +729 -0
  162. memos/mem_scheduler/orm_modules/monitor_models.py +261 -0
  163. memos/mem_scheduler/orm_modules/redis_model.py +699 -0
  164. memos/mem_scheduler/scheduler_factory.py +23 -0
  165. memos/mem_scheduler/schemas/__init__.py +0 -0
  166. memos/mem_scheduler/schemas/analyzer_schemas.py +52 -0
  167. memos/mem_scheduler/schemas/api_schemas.py +233 -0
  168. memos/mem_scheduler/schemas/general_schemas.py +55 -0
  169. memos/mem_scheduler/schemas/message_schemas.py +173 -0
  170. memos/mem_scheduler/schemas/monitor_schemas.py +406 -0
  171. memos/mem_scheduler/schemas/task_schemas.py +132 -0
  172. memos/mem_scheduler/task_schedule_modules/__init__.py +0 -0
  173. memos/mem_scheduler/task_schedule_modules/dispatcher.py +740 -0
  174. memos/mem_scheduler/task_schedule_modules/local_queue.py +247 -0
  175. memos/mem_scheduler/task_schedule_modules/orchestrator.py +74 -0
  176. memos/mem_scheduler/task_schedule_modules/redis_queue.py +1385 -0
  177. memos/mem_scheduler/task_schedule_modules/task_queue.py +162 -0
  178. memos/mem_scheduler/utils/__init__.py +0 -0
  179. memos/mem_scheduler/utils/api_utils.py +77 -0
  180. memos/mem_scheduler/utils/config_utils.py +100 -0
  181. memos/mem_scheduler/utils/db_utils.py +50 -0
  182. memos/mem_scheduler/utils/filter_utils.py +176 -0
  183. memos/mem_scheduler/utils/metrics.py +125 -0
  184. memos/mem_scheduler/utils/misc_utils.py +290 -0
  185. memos/mem_scheduler/utils/monitor_event_utils.py +67 -0
  186. memos/mem_scheduler/utils/status_tracker.py +229 -0
  187. memos/mem_scheduler/webservice_modules/__init__.py +0 -0
  188. memos/mem_scheduler/webservice_modules/rabbitmq_service.py +485 -0
  189. memos/mem_scheduler/webservice_modules/redis_service.py +380 -0
  190. memos/mem_user/factory.py +94 -0
  191. memos/mem_user/mysql_persistent_user_manager.py +271 -0
  192. memos/mem_user/mysql_user_manager.py +502 -0
  193. memos/mem_user/persistent_factory.py +98 -0
  194. memos/mem_user/persistent_user_manager.py +260 -0
  195. memos/mem_user/redis_persistent_user_manager.py +225 -0
  196. memos/mem_user/user_manager.py +488 -0
  197. memos/memories/__init__.py +0 -0
  198. memos/memories/activation/__init__.py +0 -0
  199. memos/memories/activation/base.py +42 -0
  200. memos/memories/activation/item.py +56 -0
  201. memos/memories/activation/kv.py +292 -0
  202. memos/memories/activation/vllmkv.py +219 -0
  203. memos/memories/base.py +19 -0
  204. memos/memories/factory.py +42 -0
  205. memos/memories/parametric/__init__.py +0 -0
  206. memos/memories/parametric/base.py +19 -0
  207. memos/memories/parametric/item.py +11 -0
  208. memos/memories/parametric/lora.py +41 -0
  209. memos/memories/textual/__init__.py +0 -0
  210. memos/memories/textual/base.py +92 -0
  211. memos/memories/textual/general.py +236 -0
  212. memos/memories/textual/item.py +304 -0
  213. memos/memories/textual/naive.py +187 -0
  214. memos/memories/textual/prefer_text_memory/__init__.py +0 -0
  215. memos/memories/textual/prefer_text_memory/adder.py +504 -0
  216. memos/memories/textual/prefer_text_memory/config.py +106 -0
  217. memos/memories/textual/prefer_text_memory/extractor.py +221 -0
  218. memos/memories/textual/prefer_text_memory/factory.py +85 -0
  219. memos/memories/textual/prefer_text_memory/retrievers.py +177 -0
  220. memos/memories/textual/prefer_text_memory/spliter.py +132 -0
  221. memos/memories/textual/prefer_text_memory/utils.py +93 -0
  222. memos/memories/textual/preference.py +344 -0
  223. memos/memories/textual/simple_preference.py +161 -0
  224. memos/memories/textual/simple_tree.py +69 -0
  225. memos/memories/textual/tree.py +459 -0
  226. memos/memories/textual/tree_text_memory/__init__.py +0 -0
  227. memos/memories/textual/tree_text_memory/organize/__init__.py +0 -0
  228. memos/memories/textual/tree_text_memory/organize/handler.py +184 -0
  229. memos/memories/textual/tree_text_memory/organize/manager.py +518 -0
  230. memos/memories/textual/tree_text_memory/organize/relation_reason_detector.py +238 -0
  231. memos/memories/textual/tree_text_memory/organize/reorganizer.py +622 -0
  232. memos/memories/textual/tree_text_memory/retrieve/__init__.py +0 -0
  233. memos/memories/textual/tree_text_memory/retrieve/advanced_searcher.py +364 -0
  234. memos/memories/textual/tree_text_memory/retrieve/bm25_util.py +186 -0
  235. memos/memories/textual/tree_text_memory/retrieve/bochasearch.py +419 -0
  236. memos/memories/textual/tree_text_memory/retrieve/internet_retriever.py +270 -0
  237. memos/memories/textual/tree_text_memory/retrieve/internet_retriever_factory.py +102 -0
  238. memos/memories/textual/tree_text_memory/retrieve/reasoner.py +61 -0
  239. memos/memories/textual/tree_text_memory/retrieve/recall.py +497 -0
  240. memos/memories/textual/tree_text_memory/retrieve/reranker.py +111 -0
  241. memos/memories/textual/tree_text_memory/retrieve/retrieval_mid_structs.py +16 -0
  242. memos/memories/textual/tree_text_memory/retrieve/retrieve_utils.py +472 -0
  243. memos/memories/textual/tree_text_memory/retrieve/searcher.py +848 -0
  244. memos/memories/textual/tree_text_memory/retrieve/task_goal_parser.py +135 -0
  245. memos/memories/textual/tree_text_memory/retrieve/utils.py +54 -0
  246. memos/memories/textual/tree_text_memory/retrieve/xinyusearch.py +387 -0
  247. memos/memos_tools/dinding_report_bot.py +453 -0
  248. memos/memos_tools/lockfree_dict.py +120 -0
  249. memos/memos_tools/notification_service.py +44 -0
  250. memos/memos_tools/notification_utils.py +142 -0
  251. memos/memos_tools/singleton.py +174 -0
  252. memos/memos_tools/thread_safe_dict.py +310 -0
  253. memos/memos_tools/thread_safe_dict_segment.py +382 -0
  254. memos/multi_mem_cube/__init__.py +0 -0
  255. memos/multi_mem_cube/composite_cube.py +86 -0
  256. memos/multi_mem_cube/single_cube.py +874 -0
  257. memos/multi_mem_cube/views.py +54 -0
  258. memos/parsers/__init__.py +0 -0
  259. memos/parsers/base.py +15 -0
  260. memos/parsers/factory.py +21 -0
  261. memos/parsers/markitdown.py +28 -0
  262. memos/reranker/__init__.py +4 -0
  263. memos/reranker/base.py +25 -0
  264. memos/reranker/concat.py +103 -0
  265. memos/reranker/cosine_local.py +102 -0
  266. memos/reranker/factory.py +72 -0
  267. memos/reranker/http_bge.py +324 -0
  268. memos/reranker/http_bge_strategy.py +327 -0
  269. memos/reranker/noop.py +19 -0
  270. memos/reranker/strategies/__init__.py +4 -0
  271. memos/reranker/strategies/base.py +61 -0
  272. memos/reranker/strategies/concat_background.py +94 -0
  273. memos/reranker/strategies/concat_docsource.py +110 -0
  274. memos/reranker/strategies/dialogue_common.py +109 -0
  275. memos/reranker/strategies/factory.py +31 -0
  276. memos/reranker/strategies/single_turn.py +107 -0
  277. memos/reranker/strategies/singleturn_outmem.py +98 -0
  278. memos/settings.py +10 -0
  279. memos/templates/__init__.py +0 -0
  280. memos/templates/advanced_search_prompts.py +211 -0
  281. memos/templates/cloud_service_prompt.py +107 -0
  282. memos/templates/instruction_completion.py +66 -0
  283. memos/templates/mem_agent_prompts.py +85 -0
  284. memos/templates/mem_feedback_prompts.py +822 -0
  285. memos/templates/mem_reader_prompts.py +1096 -0
  286. memos/templates/mem_reader_strategy_prompts.py +238 -0
  287. memos/templates/mem_scheduler_prompts.py +626 -0
  288. memos/templates/mem_search_prompts.py +93 -0
  289. memos/templates/mos_prompts.py +403 -0
  290. memos/templates/prefer_complete_prompt.py +735 -0
  291. memos/templates/tool_mem_prompts.py +139 -0
  292. memos/templates/tree_reorganize_prompts.py +230 -0
  293. memos/types/__init__.py +34 -0
  294. memos/types/general_types.py +151 -0
  295. memos/types/openai_chat_completion_types/__init__.py +15 -0
  296. memos/types/openai_chat_completion_types/chat_completion_assistant_message_param.py +56 -0
  297. memos/types/openai_chat_completion_types/chat_completion_content_part_image_param.py +27 -0
  298. memos/types/openai_chat_completion_types/chat_completion_content_part_input_audio_param.py +23 -0
  299. memos/types/openai_chat_completion_types/chat_completion_content_part_param.py +43 -0
  300. memos/types/openai_chat_completion_types/chat_completion_content_part_refusal_param.py +16 -0
  301. memos/types/openai_chat_completion_types/chat_completion_content_part_text_param.py +16 -0
  302. memos/types/openai_chat_completion_types/chat_completion_message_custom_tool_call_param.py +27 -0
  303. memos/types/openai_chat_completion_types/chat_completion_message_function_tool_call_param.py +32 -0
  304. memos/types/openai_chat_completion_types/chat_completion_message_param.py +18 -0
  305. memos/types/openai_chat_completion_types/chat_completion_message_tool_call_union_param.py +15 -0
  306. memos/types/openai_chat_completion_types/chat_completion_system_message_param.py +36 -0
  307. memos/types/openai_chat_completion_types/chat_completion_tool_message_param.py +30 -0
  308. memos/types/openai_chat_completion_types/chat_completion_user_message_param.py +34 -0
  309. memos/utils.py +123 -0
  310. memos/vec_dbs/__init__.py +0 -0
  311. memos/vec_dbs/base.py +117 -0
  312. memos/vec_dbs/factory.py +23 -0
  313. memos/vec_dbs/item.py +50 -0
  314. memos/vec_dbs/milvus.py +654 -0
  315. memos/vec_dbs/qdrant.py +355 -0
memos/api/client.py ADDED
@@ -0,0 +1,571 @@
1
+ import json
2
+ import mimetypes
3
+ import os
4
+
5
+ from typing import Any
6
+
7
+ import requests
8
+
9
+ from memos.api.product_models import (
10
+ MemOSAddFeedBackResponse,
11
+ MemOSAddKnowledgebaseFileResponse,
12
+ MemOSAddResponse,
13
+ MemOSChatResponse,
14
+ MemOSCreateKnowledgebaseResponse,
15
+ MemOSDeleteKnowledgebaseResponse,
16
+ MemOSDeleteMemoryResponse,
17
+ MemOSGetKnowledgebaseFileResponse,
18
+ MemOSGetMemoryResponse,
19
+ MemOSGetMessagesResponse,
20
+ MemOSGetTaskStatusResponse,
21
+ MemOSSearchResponse,
22
+ )
23
+ from memos.log import get_logger
24
+
25
+
26
+ logger = get_logger(__name__)
27
+
28
+ MAX_RETRY_COUNT = 3
29
+
30
+
31
+ class MemOSClient:
32
+ """MemOS API client"""
33
+
34
+ def __init__(self, api_key: str | None = None, base_url: str | None = None):
35
+ self.base_url = (
36
+ base_url or os.getenv("MEMOS_BASE_URL") or "https://memos.memtensor.cn/api/openmem/v1"
37
+ )
38
+ api_key = api_key or os.getenv("MEMOS_API_KEY")
39
+
40
+ if not api_key:
41
+ raise ValueError("MemOS API key is required")
42
+ self.api_key = api_key
43
+ self.headers = {"Content-Type": "application/json", "Authorization": f"Token {api_key}"}
44
+
45
+ def _validate_required_params(self, **params):
46
+ """Validate required parameters - if passed, they must not be empty"""
47
+ for param_name, param_value in params.items():
48
+ if not param_value:
49
+ raise ValueError(f"{param_name} is required")
50
+
51
+ def get_message(
52
+ self,
53
+ user_id: str,
54
+ conversation_id: str | None = None,
55
+ conversation_limit_number: int = 6,
56
+ message_limit_number: int = 6,
57
+ source: str | None = None,
58
+ ) -> MemOSGetMessagesResponse | None:
59
+ """Get messages"""
60
+ # Validate required parameters
61
+ self._validate_required_params(user_id=user_id)
62
+
63
+ url = f"{self.base_url}/get/message"
64
+ payload = {
65
+ "user_id": user_id,
66
+ "conversation_id": conversation_id,
67
+ "conversation_limit_number": conversation_limit_number,
68
+ "message_limit_number": message_limit_number,
69
+ "source": source,
70
+ }
71
+ for retry in range(MAX_RETRY_COUNT):
72
+ try:
73
+ response = requests.post(
74
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
75
+ )
76
+ response.raise_for_status()
77
+ response_data = response.json()
78
+
79
+ return MemOSGetMessagesResponse(**response_data)
80
+ except Exception as e:
81
+ logger.error(f"Failed to get messages (retry {retry + 1}/3): {e}")
82
+ if retry == MAX_RETRY_COUNT - 1:
83
+ raise
84
+
85
+ def add_message(
86
+ self,
87
+ messages: list[dict[str, Any]],
88
+ user_id: str,
89
+ conversation_id: str,
90
+ info: dict[str, Any] | None = None,
91
+ source: str | None = None,
92
+ app_id: str | None = None,
93
+ agent_id: str | None = None,
94
+ async_mode: bool = True,
95
+ tags: list[str] | None = None,
96
+ allow_public: bool = False,
97
+ allow_knowledgebase_ids: list[str] | None = None,
98
+ ) -> MemOSAddResponse | None:
99
+ """Add message"""
100
+ # Validate required parameters
101
+ self._validate_required_params(
102
+ messages=messages, user_id=user_id, conversation_id=conversation_id
103
+ )
104
+
105
+ url = f"{self.base_url}/add/message"
106
+ payload = {
107
+ "messages": messages,
108
+ "user_id": user_id,
109
+ "conversation_id": conversation_id,
110
+ "info": info,
111
+ "source": source,
112
+ "app_id": app_id,
113
+ "agent_id": agent_id,
114
+ "allow_public": allow_public,
115
+ "allow_knowledgebase_ids": allow_knowledgebase_ids,
116
+ "tags": tags,
117
+ "asyncMode": async_mode,
118
+ }
119
+ for retry in range(MAX_RETRY_COUNT):
120
+ try:
121
+ response = requests.post(
122
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
123
+ )
124
+ response.raise_for_status()
125
+ response_data = response.json()
126
+
127
+ return MemOSAddResponse(**response_data)
128
+ except Exception as e:
129
+ logger.error(f"Failed to add message (retry {retry + 1}/3): {e}")
130
+ if retry == MAX_RETRY_COUNT - 1:
131
+ raise
132
+
133
+ def search_memory(
134
+ self,
135
+ query: str,
136
+ user_id: str,
137
+ conversation_id: str,
138
+ memory_limit_number: int = 6,
139
+ include_preference: bool = True,
140
+ knowledgebase_ids: list[str] | None = None,
141
+ filter: dict[str, Any] | None = None,
142
+ source: str | None = None,
143
+ include_tool_memory: bool = False,
144
+ preference_limit_number: int = 6,
145
+ tool_memory_limit_number: int = 6,
146
+ ) -> MemOSSearchResponse | None:
147
+ """Search memories"""
148
+ # Validate required parameters
149
+ self._validate_required_params(query=query, user_id=user_id)
150
+
151
+ url = f"{self.base_url}/search/memory"
152
+ payload = {
153
+ "query": query,
154
+ "user_id": user_id,
155
+ "conversation_id": conversation_id,
156
+ "memory_limit_number": memory_limit_number,
157
+ "include_preference": include_preference,
158
+ "knowledgebase_ids": knowledgebase_ids,
159
+ "filter": filter,
160
+ "preference_limit_number": preference_limit_number,
161
+ "tool_memory_limit_number": tool_memory_limit_number,
162
+ "source": source,
163
+ "include_tool_memory": include_tool_memory,
164
+ }
165
+
166
+ for retry in range(MAX_RETRY_COUNT):
167
+ try:
168
+ response = requests.post(
169
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
170
+ )
171
+ response.raise_for_status()
172
+ response_data = response.json()
173
+
174
+ return MemOSSearchResponse(**response_data)
175
+ except Exception as e:
176
+ logger.error(f"Failed to search memory (retry {retry + 1}/3): {e}")
177
+ if retry == MAX_RETRY_COUNT - 1:
178
+ raise
179
+
180
+ def get_memory(
181
+ self, user_id: str, include_preference: bool = True, page: int = 1, size: int = 10
182
+ ) -> MemOSGetMemoryResponse | None:
183
+ """get memories"""
184
+ # Validate required parameters
185
+ self._validate_required_params(include_preference=include_preference, user_id=user_id)
186
+
187
+ url = f"{self.base_url}/get/memory"
188
+ payload = {
189
+ "include_preference": include_preference,
190
+ "user_id": user_id,
191
+ "page": page,
192
+ "size": size,
193
+ }
194
+
195
+ for retry in range(MAX_RETRY_COUNT):
196
+ try:
197
+ response = requests.post(
198
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
199
+ )
200
+ response.raise_for_status()
201
+ response_data = response.json()
202
+
203
+ return MemOSGetMemoryResponse(**response_data)
204
+ except Exception as e:
205
+ logger.error(f"Failed to get memory (retry {retry + 1}/3): {e}")
206
+ if retry == MAX_RETRY_COUNT - 1:
207
+ raise
208
+
209
+ def create_knowledgebase(
210
+ self, knowledgebase_name: str, knowledgebase_description: str
211
+ ) -> MemOSCreateKnowledgebaseResponse | None:
212
+ """
213
+ Create knowledgebase
214
+ """
215
+ # Validate required parameters
216
+ self._validate_required_params(
217
+ knowledgebase_name=knowledgebase_name,
218
+ knowledgebase_description=knowledgebase_description,
219
+ )
220
+
221
+ url = f"{self.base_url}/create/knowledgebase"
222
+ payload = {
223
+ "knowledgebase_name": knowledgebase_name,
224
+ "knowledgebase_description": knowledgebase_description,
225
+ }
226
+
227
+ for retry in range(MAX_RETRY_COUNT):
228
+ try:
229
+ response = requests.post(
230
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
231
+ )
232
+ response.raise_for_status()
233
+ response_data = response.json()
234
+
235
+ return MemOSCreateKnowledgebaseResponse(**response_data)
236
+ except Exception as e:
237
+ logger.error(f"Failed to create knowledgebase (retry {retry + 1}/3): {e}")
238
+ if retry == MAX_RETRY_COUNT - 1:
239
+ raise
240
+
241
+ def delete_knowledgebase(
242
+ self, knowledgebase_id: str
243
+ ) -> MemOSDeleteKnowledgebaseResponse | None:
244
+ """
245
+ Delete knowledgebase
246
+ """
247
+ # Validate required parameters
248
+ self._validate_required_params(knowledgebase_id=knowledgebase_id)
249
+
250
+ url = f"{self.base_url}/delete/knowledgebase"
251
+ payload = {
252
+ "knowledgebase_id": knowledgebase_id,
253
+ }
254
+
255
+ for retry in range(MAX_RETRY_COUNT):
256
+ try:
257
+ response = requests.post(
258
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
259
+ )
260
+ response.raise_for_status()
261
+ response_data = response.json()
262
+
263
+ return MemOSDeleteKnowledgebaseResponse(**response_data)
264
+ except Exception as e:
265
+ logger.error(f"Failed to delete knowledgebase (retry {retry + 1}/3): {e}")
266
+ if retry == MAX_RETRY_COUNT - 1:
267
+ raise
268
+
269
+ def add_knowledgebase_file_json(
270
+ self, knowledgebase_id: str, file: list[dict[str, Any]]
271
+ ) -> MemOSAddKnowledgebaseFileResponse | None:
272
+ """
273
+ add knowledgebase-file from json
274
+ """
275
+ # Validate required parameters
276
+ self._validate_required_params(knowledgebase_id=knowledgebase_id, file=file)
277
+
278
+ url = f"{self.base_url}/add/knowledgebase-file"
279
+ payload = {
280
+ "knowledgebase_id": knowledgebase_id,
281
+ "file": file,
282
+ }
283
+
284
+ for retry in range(MAX_RETRY_COUNT):
285
+ try:
286
+ response = requests.post(
287
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
288
+ )
289
+ response.raise_for_status()
290
+ response_data = response.json()
291
+
292
+ return MemOSAddKnowledgebaseFileResponse(**response_data)
293
+ except Exception as e:
294
+ logger.error(f"Failed to add knowledgebase-file json (retry {retry + 1}/3): {e}")
295
+ if retry == MAX_RETRY_COUNT - 1:
296
+ raise
297
+
298
+ def add_knowledgebase_file_form(
299
+ self, knowledgebase_id: str, files: list[str]
300
+ ) -> MemOSAddKnowledgebaseFileResponse | None:
301
+ """
302
+ add knowledgebase-file from form
303
+ """
304
+ # Validate required parameters
305
+ self._validate_required_params(knowledgebase_id=knowledgebase_id, files=files)
306
+
307
+ def build_file_form_param(file_path):
308
+ """
309
+ form-Automatically generate the structure required for the `files` parameter in requests based on the local file path
310
+ """
311
+ if not os.path.isfile(file_path):
312
+ logger.warning(f"File {file_path} does not exist")
313
+ return None
314
+ filename = os.path.basename(file_path)
315
+
316
+ mime_type, _ = mimetypes.guess_type(file_path)
317
+ if mime_type is None:
318
+ mime_type = "application/octet-stream"
319
+ return ("file", (filename, open(file_path, "rb"), mime_type))
320
+
321
+ url = f"{self.base_url}/add/knowledgebase-file"
322
+ payload = {
323
+ "knowledgebase_id": knowledgebase_id,
324
+ }
325
+ headers = {
326
+ "Authorization": f"Token {self.api_key}",
327
+ }
328
+ for retry in range(MAX_RETRY_COUNT):
329
+ try:
330
+ response = requests.post(
331
+ url,
332
+ params=payload,
333
+ headers=headers,
334
+ timeout=30,
335
+ files=[build_file_form_param(file_path) for file_path in files],
336
+ )
337
+ response.raise_for_status()
338
+ response_data = response.json()
339
+ print(response_data)
340
+
341
+ return MemOSAddKnowledgebaseFileResponse(**response_data)
342
+ except Exception as e:
343
+ logger.error(f"Failed to add knowledgebase-file form (retry {retry + 1}/3): {e}")
344
+ if retry == MAX_RETRY_COUNT - 1:
345
+ raise
346
+
347
+ def delete_knowledgebase_file(
348
+ self, file_ids: list[str]
349
+ ) -> MemOSDeleteKnowledgebaseResponse | None:
350
+ """
351
+ delete knowledgebase-file
352
+ """
353
+ # Validate required parameters
354
+ self._validate_required_params(file_ids=file_ids)
355
+
356
+ url = f"{self.base_url}/delete/knowledgebase-file"
357
+ payload = {
358
+ "file_ids": file_ids,
359
+ }
360
+
361
+ for retry in range(MAX_RETRY_COUNT):
362
+ try:
363
+ response = requests.post(
364
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
365
+ )
366
+ response.raise_for_status()
367
+ response_data = response.json()
368
+
369
+ return MemOSDeleteKnowledgebaseResponse(**response_data)
370
+ except Exception as e:
371
+ logger.error(f"Failed to delete knowledgebase-file (retry {retry + 1}/3): {e}")
372
+ if retry == MAX_RETRY_COUNT - 1:
373
+ raise
374
+
375
+ def get_knowledgebase_file(
376
+ self, file_ids: list[str]
377
+ ) -> MemOSGetKnowledgebaseFileResponse | None:
378
+ """
379
+ get knowledgebase-file
380
+ """
381
+ # Validate required parameters
382
+ self._validate_required_params(file_ids=file_ids)
383
+
384
+ url = f"{self.base_url}/get/knowledgebase-file"
385
+ payload = {
386
+ "file_ids": file_ids,
387
+ }
388
+
389
+ for retry in range(MAX_RETRY_COUNT):
390
+ try:
391
+ response = requests.post(
392
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
393
+ )
394
+ response.raise_for_status()
395
+ response_data = response.json()
396
+
397
+ return MemOSGetKnowledgebaseFileResponse(**response_data)
398
+ except Exception as e:
399
+ logger.error(f"Failed to get knowledgebase-file (retry {retry + 1}/3): {e}")
400
+ if retry == MAX_RETRY_COUNT - 1:
401
+ raise
402
+
403
+ def get_task_status(self, task_id: str) -> MemOSGetTaskStatusResponse | None:
404
+ """
405
+ get task status
406
+ """
407
+ # Validate required parameters
408
+ self._validate_required_params(task_id=task_id)
409
+
410
+ url = f"{self.base_url}/get/status"
411
+ payload = {
412
+ "task_id": task_id,
413
+ }
414
+
415
+ for retry in range(MAX_RETRY_COUNT):
416
+ try:
417
+ response = requests.post(
418
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
419
+ )
420
+ response.raise_for_status()
421
+ response_data = response.json()
422
+
423
+ return MemOSGetTaskStatusResponse(**response_data)
424
+ except Exception as e:
425
+ logger.error(f"Failed to get task status (retry {retry + 1}/3): {e}")
426
+ if retry == MAX_RETRY_COUNT - 1:
427
+ raise
428
+
429
+ def add_feedback(
430
+ self,
431
+ user_id: str,
432
+ conversation_id: str,
433
+ feedback_content: str,
434
+ agent_id: str | None = None,
435
+ app_id: str | None = None,
436
+ feedback_time: str | None = None,
437
+ allow_public: bool = False,
438
+ allow_knowledgebase_ids: list[str] | None = None,
439
+ ) -> MemOSAddFeedBackResponse | None:
440
+ """Add feedback"""
441
+ # Validate required parameters
442
+ self._validate_required_params(
443
+ feedback_content=feedback_content, user_id=user_id, conversation_id=conversation_id
444
+ )
445
+
446
+ url = f"{self.base_url}/add/feedback"
447
+ payload = {
448
+ "feedback_content": feedback_content,
449
+ "user_id": user_id,
450
+ "conversation_id": conversation_id,
451
+ "agent_id": agent_id,
452
+ "app_id": app_id,
453
+ "feedback_time": feedback_time,
454
+ "allow_public": allow_public,
455
+ "allow_knowledgebase_ids": allow_knowledgebase_ids,
456
+ }
457
+ for retry in range(MAX_RETRY_COUNT):
458
+ try:
459
+ response = requests.post(
460
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
461
+ )
462
+ response.raise_for_status()
463
+ response_data = response.json()
464
+
465
+ return MemOSAddFeedBackResponse(**response_data)
466
+ except Exception as e:
467
+ logger.error(f"Failed to add feedback (retry {retry + 1}/3): {e}")
468
+ if retry == MAX_RETRY_COUNT - 1:
469
+ raise
470
+
471
+ def delete_memory(
472
+ self, user_ids: list[str], memory_ids: list[str]
473
+ ) -> MemOSDeleteMemoryResponse | None:
474
+ """delete_memory memories"""
475
+ # Validate required parameters
476
+ self._validate_required_params(user_ids=user_ids, memory_ids=memory_ids)
477
+
478
+ url = f"{self.base_url}/delete/memory"
479
+ payload = {
480
+ "user_ids": user_ids,
481
+ "memory_ids": memory_ids,
482
+ }
483
+
484
+ for retry in range(MAX_RETRY_COUNT):
485
+ try:
486
+ response = requests.post(
487
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
488
+ )
489
+ response.raise_for_status()
490
+ response_data = response.json()
491
+
492
+ return MemOSDeleteMemoryResponse(**response_data)
493
+ except Exception as e:
494
+ logger.error(f"Failed to delete memory (retry {retry + 1}/3): {e}")
495
+ if retry == MAX_RETRY_COUNT - 1:
496
+ raise
497
+
498
+ def chat(
499
+ self,
500
+ user_id: str,
501
+ conversation_id: str,
502
+ query: str,
503
+ internet_search: bool = False,
504
+ force_stop: bool = False,
505
+ use_mem_os_cube: bool = False,
506
+ source: str | None = None,
507
+ system_prompt: str | None = None,
508
+ model_name: str | None = None,
509
+ knowledgebase_ids: list[str] | None = None,
510
+ filter: dict[str:Any] | None = None,
511
+ add_message_on_answer: bool = False,
512
+ app_id: str | None = None,
513
+ agent_id: str | None = None,
514
+ async_mode: bool = True,
515
+ tags: list[str] | None = None,
516
+ info: dict[str:Any] | None = None,
517
+ allow_public: bool = False,
518
+ max_tokens: int = 8192,
519
+ temperature: float | None = None,
520
+ top_p: float | None = None,
521
+ include_preference: bool = True,
522
+ preference_limit_number: int = 6,
523
+ memory_limit_number: int = 6,
524
+ ) -> MemOSChatResponse | None:
525
+ """chat"""
526
+ # Validate required parameters
527
+ self._validate_required_params(
528
+ user_id=user_id, conversation_id=conversation_id, query=query
529
+ )
530
+
531
+ url = f"{self.base_url}/chat"
532
+ payload = {
533
+ "user_id": user_id,
534
+ "conversation_id": conversation_id,
535
+ "query": query,
536
+ "internet_search": internet_search,
537
+ "force_stop": force_stop,
538
+ "use_mem_os_cube": use_mem_os_cube,
539
+ "source": source,
540
+ "system_prompt": system_prompt,
541
+ "model_name": model_name,
542
+ "knowledgebase_ids": knowledgebase_ids,
543
+ "filter": filter,
544
+ "add_message_on_answer": add_message_on_answer,
545
+ "app_id": app_id,
546
+ "agent_id": agent_id,
547
+ "async_mode": async_mode,
548
+ "tags": tags,
549
+ "info": info,
550
+ "allow_public": allow_public,
551
+ "max_tokens": max_tokens,
552
+ "temperature": temperature,
553
+ "top_p": top_p,
554
+ "include_preference": include_preference,
555
+ "preference_limit_number": preference_limit_number,
556
+ "memory_limit_number": memory_limit_number,
557
+ }
558
+
559
+ for retry in range(MAX_RETRY_COUNT):
560
+ try:
561
+ response = requests.post(
562
+ url, data=json.dumps(payload), headers=self.headers, timeout=30
563
+ )
564
+ response.raise_for_status()
565
+ response_data = response.json()
566
+
567
+ return MemOSChatResponse(**response_data)
568
+ except Exception as e:
569
+ logger.error(f"Failed to chat (retry {retry + 1}/3): {e}")
570
+ if retry == MAX_RETRY_COUNT - 1:
571
+ raise