diff --git a/src/memos/api/handlers/chat_handler.py b/src/memos/api/handlers/chat_handler.py index caeba0ca1..812cf2793 100644 --- a/src/memos/api/handlers/chat_handler.py +++ b/src/memos/api/handlers/chat_handler.py @@ -482,7 +482,7 @@ def generate_chat_response() -> Generator[str, None, None]: # get preference string pref_string = search_response.data.get("pref_string", "") - yield f"data: {json.dumps({'type': 'reference', 'data': reference})}\n\n" + yield f"data: {json.dumps({'type': 'reference', 'data': reference}, ensure_ascii=False)}\n\n" # Prepare preference markdown string if chat_req.include_preference: @@ -586,7 +586,7 @@ def generate_chat_response() -> Generator[str, None, None]: internet_reference = self._get_internet_reference( search_response.data.get("text_mem")[0]["memories"] ) - yield f"data: {json.dumps({'type': 'reference', 'data': reference})}\n\n" + yield f"data: {json.dumps({'type': 'reference', 'data': reference}, ensure_ascii=False)}\n\n" # Step 2: Build system prompt with memories lang = detect_lang(chat_req.query) @@ -684,7 +684,7 @@ def generate_chat_response() -> Generator[str, None, None]: if chat_req.internet_search or parsed_goal.internet_search: # Yield internet reference after text response - yield f"data: {json.dumps({'type': 'internet_reference', 'data': internet_reference})}\n\n" + yield f"data: {json.dumps({'type': 'internet_reference', 'data': internet_reference}, ensure_ascii=False)}\n\n" # Calculate timing time_end = time.time() @@ -697,7 +697,7 @@ def generate_chat_response() -> Generator[str, None, None]: current_messages.append({"role": "assistant", "content": full_response}) further_suggestion = self._get_further_suggestion(current_messages) self.logger.info(f"[PLAYGROUND CHAT] further_suggestion: {further_suggestion}") - yield f"data: {json.dumps({'type': 'suggestion', 'data': further_suggestion})}\n\n" + yield f"data: {json.dumps({'type': 'suggestion', 'data': further_suggestion}, ensure_ascii=False)}\n\n" yield f"data: {json.dumps({'type': 'end'})}\n\n" diff --git a/src/memos/api/product_models.py b/src/memos/api/product_models.py index f0a4e333b..ee7a45c2d 100644 --- a/src/memos/api/product_models.py +++ b/src/memos/api/product_models.py @@ -1197,3 +1197,13 @@ class GetUserNamesByMemoryIdsRequest(BaseRequest): class GetUserNamesByMemoryIdsResponse(BaseResponse[dict[str, str | None]]): """Response model for getting user names by memory ids.""" + + +class ExistMemCubeIdRequest(BaseRequest): + """Request model for checking if mem cube id exists.""" + + mem_cube_id: str = Field(..., description="Mem cube ID") + + +class ExistMemCubeIdResponse(BaseResponse[dict[str, bool]]): + """Response model for checking if mem cube id exists.""" diff --git a/src/memos/api/routers/server_router.py b/src/memos/api/routers/server_router.py index 7c0f3ea8f..c60e84253 100644 --- a/src/memos/api/routers/server_router.py +++ b/src/memos/api/routers/server_router.py @@ -33,6 +33,8 @@ ChatRequest, DeleteMemoryRequest, DeleteMemoryResponse, + ExistMemCubeIdRequest, + ExistMemCubeIdResponse, GetMemoryPlaygroundRequest, GetMemoryRequest, GetMemoryResponse, @@ -362,3 +364,17 @@ def get_user_names_by_memory_ids(request: GetUserNamesByMemoryIdsRequest): message="Successfully", data=result, ) + + +@router.post( + "/exist_mem_cube_id", + summary="Check if mem cube id exists", + response_model=ExistMemCubeIdResponse, +) +def exist_mem_cube_id(request: ExistMemCubeIdRequest): + """Check if mem cube id exists.""" + return ExistMemCubeIdResponse( + code=200, + message="Successfully", + data=graph_db.exist_user_name(user_name=request.mem_cube_id), + ) diff --git a/src/memos/memories/textual/tree_text_memory/retrieve/utils.py b/src/memos/memories/textual/tree_text_memory/retrieve/utils.py index bcd47b078..54caa20f7 100644 --- a/src/memos/memories/textual/tree_text_memory/retrieve/utils.py +++ b/src/memos/memories/textual/tree_text_memory/retrieve/utils.py @@ -27,7 +27,7 @@ "tags": [...], "goal_type": "retrieval | qa | generation", "rephrased_instruction": "...", # return an empty string if the original instruction is easy enough to understand - "internet_search": True/False, + "internet_search": true/false, "memories": ["...", "...", ...] } """