Query using MemOS's official search() method. Uses MemOS's native vector search for retrieval, then generates response. Args: question: User question to answer. system_message: Optional system prompt. **kwargs: Additional arguments (unused
(
self,
question: str,
system_message: Optional[str] = None,
**kwargs,
)
| 351 | ) |
| 352 | |
| 353 | def query( |
| 354 | self, |
| 355 | question: str, |
| 356 | system_message: Optional[str] = None, |
| 357 | **kwargs, |
| 358 | ) -> AgentResponse: |
| 359 | """Query using MemOS's official search() method. |
| 360 | |
| 361 | Uses MemOS's native vector search for retrieval, then generates response. |
| 362 | |
| 363 | Args: |
| 364 | question: User question to answer. |
| 365 | system_message: Optional system prompt. |
| 366 | **kwargs: Additional arguments (unused). |
| 367 | |
| 368 | Returns: |
| 369 | AgentResponse with answer and retrieval details. |
| 370 | """ |
| 371 | context_id = self._get_context_id() |
| 372 | memory_system = self._get_memory_system(context_id) |
| 373 | |
| 374 | # Truncate question |
| 375 | bounded_question = self._truncate_to_tokens(question, self.max_question_tokens) |
| 376 | |
| 377 | start_time = time.time() |
| 378 | |
| 379 | # Use MemOS's official search() method |
| 380 | # Request exactly retrieve_num results (no over-fetching) |
| 381 | memory_items = memory_system.search(bounded_question, top_k=self.retrieve_num) |
| 382 | |
| 383 | search_time = time.time() - start_time |
| 384 | |
| 385 | # Calculate token budget for memory context |
| 386 | system_tokens = self._llm_client.count_tokens(system_message) if system_message else 0 |
| 387 | reserved_tokens = self.max_tokens + 500 |
| 388 | available_tokens = max(self.max_context_tokens - reserved_tokens - system_tokens, 0) |
| 389 | question_tokens = self._llm_client.count_tokens(bounded_question) |
| 390 | memory_budget = max(available_tokens - question_tokens, 0) |
| 391 | memory_budget = min(memory_budget, self.max_memory_tokens) |
| 392 | |
| 393 | # Build memory context with truncation |
| 394 | retrieved_memories: List[Dict[str, Any]] = [] |
| 395 | memory_blocks: List[str] = [] |
| 396 | used_tokens = 0 |
| 397 | |
| 398 | for item in memory_items: |
| 399 | mem_text = str(getattr(item, "memory", "") or "").strip() |
| 400 | if not mem_text: |
| 401 | continue |
| 402 | |
| 403 | mem_tokens = self._llm_client.count_tokens(mem_text) |
| 404 | if used_tokens + mem_tokens > memory_budget: |
| 405 | # Truncate this memory to fit remaining budget |
| 406 | remaining = memory_budget - used_tokens |
| 407 | if remaining > 100: |
| 408 | truncated = self._truncate_to_tokens(mem_text, remaining) |
| 409 | memory_blocks.append(truncated) |
| 410 | retrieved_memories.append({ |
nothing calls this directly
no test coverage detected