Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
70373f9
fix playground bug, internet search judge
Dec 4, 2025
d181339
Merge branch 'dev' into feat/fix_palyground_bug
Dec 4, 2025
11cf00a
fix playground internet bug
Dec 4, 2025
6b10ce1
merge dev
Dec 4, 2025
c861f61
modify delete mem
Dec 4, 2025
e638039
modify tool resp bug in multi cube
Dec 4, 2025
dcd3d50
Merge branch 'dev' into feat/fix_palyground_bug
Dec 4, 2025
0c0eff8
Merge branch 'dev' into feat/fix_palyground_bug
Dec 5, 2025
8765dc4
fix bug in playground chat handle and search inter
Dec 5, 2025
1a335db
modify prompt
Dec 5, 2025
18320ff
fix bug in playground
Dec 6, 2025
666b897
fix bug playfround
Dec 6, 2025
275b9b6
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
0d22512
fix bug
Dec 7, 2025
d38f55f
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
a9eb1f6
fix code
Dec 7, 2025
94ad709
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
723a14f
fix model bug in playground
Dec 7, 2025
6f06a23
Merge branch 'dev' into feat/fix_palyground_bug
Dec 7, 2025
a300670
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
7ee13b1
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
5ab6e92
modify plan b
Dec 8, 2025
1bb0bcd
llm param modify
Dec 8, 2025
1b607e7
Merge branch 'dev' into feat/fix_palyground_bug
Dec 8, 2025
f5bc426
add logger in playground
Dec 8, 2025
a9fa309
modify code
Dec 9, 2025
d2efa24
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
9ebfbe1
Merge branch 'dev' into feat/fix_palyground_bug
fridayL Dec 9, 2025
4c055d0
fix bug
Dec 9, 2025
27b4fc4
modify code
Dec 9, 2025
cefeefb
modify code
Dec 9, 2025
7e05fa7
fix bug
Dec 9, 2025
a4f66b1
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
9b47647
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
05da172
fix search bug in plarground
Dec 9, 2025
e410ec2
fixx bug
Dec 9, 2025
0324588
move schadualr to back
Dec 9, 2025
a834028
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
4084954
modify pref location
Dec 9, 2025
de5e372
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
87861ab
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
8b547b8
modify fast net search
Dec 9, 2025
c915867
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
2f238fd
Merge branch 'dev' into feat/fix_palyground_bug
Dec 9, 2025
4543332
add tags and new package
Dec 10, 2025
c51ef0d
merge dev
Dec 10, 2025
033e8bd
modify prompt fix bug
Dec 10, 2025
e300112
Merge branch 'dev' into feat/fix_palyground_bug
Dec 10, 2025
da498fc
Merge branch 'dev' into feat/fix_palyground_bug
Dec 10, 2025
4057f5d
remove nltk due to image promblem
Dec 10, 2025
479d74e
Merge branch 'dev' into feat/fix_palyground_bug
Dec 10, 2025
ecff6e5
prompt modify
Dec 11, 2025
1b4ef23
Merge branch 'dev' into feat/fix_palyground_bug
Dec 11, 2025
7e18cae
modify bug remove redundant field
Dec 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
107 changes: 60 additions & 47 deletions src/memos/api/handlers/chat_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
prepare_reference_data,
process_streaming_references_complete,
)
from memos.mem_reader.read_multi_modal.utils import detect_lang
from memos.mem_scheduler.schemas.message_schemas import ScheduleMessageItem
from memos.mem_scheduler.schemas.task_schemas import (
ANSWER_TASK_LABEL,
Expand Down Expand Up @@ -409,7 +410,6 @@ def generate_chat_response() -> Generator[str, None, None]:
pref_top_k=chat_req.pref_top_k,
filter=chat_req.filter,
search_tool_memory=False,
playground_search_goal_parser=False,
)
start_time = time.time()
search_response = self.search_handler.handle_search_memories(search_req)
Expand Down Expand Up @@ -491,7 +491,6 @@ def generate_chat_response() -> Generator[str, None, None]:
filter=chat_req.filter,
search_memory_type="All",
search_tool_memory=False,
playground_search_goal_parser=False,
)
start_time = time.time()
search_response = self.search_handler.handle_search_memories(search_req)
Expand Down Expand Up @@ -532,8 +531,9 @@ def generate_chat_response() -> Generator[str, None, None]:
)

# Step 2: Build system prompt with memories
lang = detect_lang(chat_req.query)
system_prompt = self._build_enhance_system_prompt(
filtered_memories, pref_string
filtered_memories, pref_string, lang=lang
)

# Prepare messages
Expand All @@ -550,50 +550,62 @@ def generate_chat_response() -> Generator[str, None, None]:
)

# Step 3: Generate streaming response from LLM
model = next(iter(self.chat_llms.keys()))
response_stream = self.chat_llms[model].generate_stream(
current_messages, model_name_or_path=model
)

# Stream the response
buffer = ""
full_response = ""
in_think = False

for chunk in response_stream:
if chunk == "<think>":
in_think = True
yield f"data: {json.dumps({'type': 'status', 'data': 'reasoning'})}\n\n"
continue
if chunk == "</think>":
in_think = False
yield f"data: {json.dumps({'type': 'status', 'data': '2'})}\n\n"
continue

if in_think:
chunk_data = f"data: {json.dumps({'type': 'reasoning', 'data': chunk}, ensure_ascii=False)}\n\n"
yield chunk_data
continue

buffer += chunk
full_response += chunk

# Process buffer to ensure complete reference tags
processed_chunk, remaining_buffer = process_streaming_references_complete(
buffer
try:
model = next(iter(self.chat_llms.keys()))
response_stream = self.chat_llms[model].generate_stream(
current_messages, model_name_or_path=model
)

if processed_chunk:
chunk_data = f"data: {json.dumps({'type': 'text', 'data': processed_chunk}, ensure_ascii=False)}\n\n"
yield chunk_data
buffer = remaining_buffer

# Process any remaining buffer
if buffer:
processed_chunk, _ = process_streaming_references_complete(buffer)
if processed_chunk:
chunk_data = f"data: {json.dumps({'type': 'text', 'data': processed_chunk}, ensure_ascii=False)}\n\n"
yield chunk_data
# Stream the response
buffer = ""
full_response = ""
in_think = False

for chunk in response_stream:
if chunk == "<think>":
in_think = True
yield f"data: {json.dumps({'type': 'status', 'data': 'reasoning'})}\n\n"
continue
if chunk == "</think>":
in_think = False
yield f"data: {json.dumps({'type': 'status', 'data': '2'})}\n\n"
continue

if in_think:
chunk_data = f"data: {json.dumps({'type': 'reasoning', 'data': chunk}, ensure_ascii=False)}\n\n"
yield chunk_data
continue

buffer += chunk
full_response += chunk

# Process buffer to ensure complete reference tags
processed_chunk, remaining_buffer = (
process_streaming_references_complete(buffer)
)

if processed_chunk:
chunk_data = f"data: {json.dumps({'type': 'text', 'data': processed_chunk}, ensure_ascii=False)}\n\n"
yield chunk_data
buffer = remaining_buffer

# Process any remaining buffer
if buffer:
processed_chunk, _ = process_streaming_references_complete(buffer)
if processed_chunk:
chunk_data = f"data: {json.dumps({'type': 'text', 'data': processed_chunk}, ensure_ascii=False)}\n\n"
yield chunk_data

except Exception as llm_error:
# Log the error
self.logger.error(
f"Error during LLM generation: {llm_error}", exc_info=True
)
# Send error message to client
error_msg = f"模型生成错误: {llm_error!s}"
yield f"data: {json.dumps({'type': 'error', 'data': error_msg}, ensure_ascii=False)}\n\n"
# Re-raise to let outer exception handler process it
raise

if chat_req.internet_search or parsed_goal.internet_search:
# Yield internet reference after text response
Expand Down Expand Up @@ -766,6 +778,7 @@ def _build_enhance_system_prompt(
self,
memories_list: list,
pref_string: str = "",
lang: str = "en",
tone: str = "friendly",
verbosity: str = "mid",
) -> str:
Expand All @@ -782,9 +795,9 @@ def _build_enhance_system_prompt(
System prompt string
"""
now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d (%A)")
formatted_date = now.strftime("%Y-%m-%d %H:%M (%A)")
sys_body = get_memos_prompt(
date=formatted_date, tone=tone, verbosity=verbosity, mode="enhance"
date=formatted_date, tone=tone, verbosity=verbosity, mode="enhance", lang=lang
)

# Format memories
Expand Down
3 changes: 0 additions & 3 deletions src/memos/api/product_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -461,9 +461,6 @@ def _convert_deprecated_fields(self) -> "APISearchRequest":
class APISearchPlaygroundRequest(APISearchRequest):
"""Request model for searching memories in playground."""

# TODO: tmp field for playground search goal parser, will be removed later
playground_search_goal_parser: bool = Field(False, description="Playground search goal parser")


class APIADDRequest(BaseRequest):
"""Request model for creating memories."""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -123,16 +123,6 @@ def _post(self, url: str, body: dict) -> list[dict]:
class BochaAISearchRetriever:
"""BochaAI retriever that converts search results into TextualMemoryItem objects"""

@require_python_package(
import_name="rake_nltk",
install_command="pip install rake_nltk",
install_link="https://pypi.org/project/rake-nltk/",
)
@require_python_package(
import_name="nltk",
install_command="pip install nltk",
install_link="https://www.nltk.org/install.html",
)
@require_python_package(
import_name="jieba",
install_command="pip install jieba",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,7 @@ def _parse_task(
query_embedding = None

# fine mode will trigger initial embedding search
# TODO: tmp "playground_search_goal_parser" for playground search goal parser, will be removed later
if mode == "fine_old" or kwargs.get("playground_search_goal_parser", False):
if mode == "fine_old":
logger.info("[SEARCH] Fine mode: embedding search")
query_embedding = self.embedder.embed([query])[0]

Expand Down Expand Up @@ -275,10 +274,6 @@ def _parse_task(
**kwargs,
)

# TODO: tmp field playground_search_goal_parser for playground, will be removed later
if kwargs.get("playground_search_goal_parser", False):
parsed_goal.internet_search = False

query = parsed_goal.rephrased_query or query
# if goal has extra memories, embed them too
if parsed_goal.memories:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,6 @@ def parse(
- mode == 'fast': use jieba to split words only
- mode == 'fine': use LLM to parse structured topic/keys/tags
"""
# TODO: tmp mode for playground search goal parser, will be removed later
if kwargs.get("playground_search_goal_parser", False):
mode = "fine"

if mode == "fast":
return self._parse_fast(task_description, context=context, **kwargs)
Expand Down
4 changes: 0 additions & 4 deletions src/memos/multi_mem_cube/single_cube.py
Original file line number Diff line number Diff line change
Expand Up @@ -444,10 +444,6 @@ def _fast_search(
plugin=plugin,
search_tool_memory=search_req.search_tool_memory,
tool_mem_top_k=search_req.tool_mem_top_k,
# TODO: tmp field for playground search goal parser, will be removed later
playground_search_goal_parser=search_req.playground_search_goal_parser
if hasattr(search_req, "playground_search_goal_parser")
else False,
)

formatted_memories = [format_memory_item(data) for data in search_results]
Expand Down
Loading