Skip to content
8 changes: 4 additions & 4 deletions src/memos/api/handlers/chat_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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()
Expand All @@ -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"

Expand Down
10 changes: 10 additions & 0 deletions src/memos/api/product_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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."""
16 changes: 16 additions & 0 deletions src/memos/api/routers/server_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
ChatRequest,
DeleteMemoryRequest,
DeleteMemoryResponse,
ExistMemCubeIdRequest,
ExistMemCubeIdResponse,
GetMemoryPlaygroundRequest,
GetMemoryRequest,
GetMemoryResponse,
Expand Down Expand Up @@ -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),
)
Original file line number Diff line number Diff line change
Expand Up @@ -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": ["...", "...", ...]
}
"""
Expand Down