Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
50 changes: 3 additions & 47 deletions poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 1 addition & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,7 @@ all = [
"markitdown[docx,pdf,pptx,xls,xlsx] (>=0.1.1,<0.2.0)",
"pymilvus (>=2.6.1,<3.0.0)",
"datasketch (>=1.6.5,<2.0.0)",
"jieba (>=0.38.1,<0.42.1)",
"rank-bm25 (>=0.2.2)",
"cachetools (>=6.0.0)",

# NOT exist in the above optional groups
# Because they are either huge-size dependencies or infrequently used dependencies.
# We kindof don't want users to install them.
Expand Down
34 changes: 3 additions & 31 deletions src/memos/api/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -419,31 +419,17 @@ def get_embedder_config() -> dict[str, Any]:
},
}

@staticmethod
def get_reader_config() -> dict[str, Any]:
"""Get reader configuration."""
return {
"backend": os.getenv("MEM_READER_BACKEND", "simple_struct"),
"config": {
"chunk_type": os.getenv("MEM_READER_CHAT_CHUNK_TYPE", "default"),
"chunk_length": int(os.getenv("MEM_READER_CHAT_CHUNK_TOKEN_SIZE", 1600)),
"chunk_session": int(os.getenv("MEM_READER_CHAT_CHUNK_SESS_SIZE", 20)),
"chunk_overlap": int(os.getenv("MEM_READER_CHAT_CHUNK_OVERLAP", 2)),
},
}

@staticmethod
def get_internet_config() -> dict[str, Any]:
"""Get embedder configuration."""
reader_config = APIConfig.get_reader_config()
return {
"backend": "bocha",
"config": {
"api_key": os.getenv("BOCHA_API_KEY"),
"max_results": 15,
"num_per_request": 10,
"reader": {
"backend": reader_config["backend"],
"backend": "simple_struct",
"config": {
"llm": {
"backend": "openai",
Expand All @@ -469,7 +455,6 @@ def get_internet_config() -> dict[str, Any]:
"min_sentences_per_chunk": 1,
},
},
"chat_chunker": reader_config,
},
},
},
Expand Down Expand Up @@ -671,8 +656,6 @@ def get_product_default_config() -> dict[str, Any]:
openai_config = APIConfig.get_openai_config()
qwen_config = APIConfig.qwen_config()
vllm_config = APIConfig.vllm_config()
reader_config = APIConfig.get_reader_config()

backend_model = {
"openai": openai_config,
"huggingface": qwen_config,
Expand All @@ -684,7 +667,7 @@ def get_product_default_config() -> dict[str, Any]:
"user_id": os.getenv("MOS_USER_ID", "root"),
"chat_model": {"backend": backend, "config": backend_model[backend]},
"mem_reader": {
"backend": reader_config["backend"],
"backend": "simple_struct",
"config": {
"llm": APIConfig.get_memreader_config(),
"embedder": APIConfig.get_embedder_config(),
Expand All @@ -697,7 +680,6 @@ def get_product_default_config() -> dict[str, Any]:
"min_sentences_per_chunk": 1,
},
},
"chat_chunker": reader_config,
},
},
"enable_textual_memory": True,
Expand Down Expand Up @@ -768,7 +750,6 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General
qwen_config = APIConfig.qwen_config()
vllm_config = APIConfig.vllm_config()
mysql_config = APIConfig.get_mysql_config()
reader_config = APIConfig.get_reader_config()
backend = os.getenv("MOS_CHAT_MODEL_PROVIDER", "openai")
backend_model = {
"openai": openai_config,
Expand All @@ -783,7 +764,7 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General
"config": backend_model[backend],
},
"mem_reader": {
"backend": reader_config["backend"],
"backend": "simple_struct",
"config": {
"llm": APIConfig.get_memreader_config(),
"embedder": APIConfig.get_embedder_config(),
Expand All @@ -796,7 +777,6 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General
"min_sentences_per_chunk": 1,
},
},
"chat_chunker": reader_config,
},
},
"enable_textual_memory": True,
Expand Down Expand Up @@ -865,10 +845,6 @@ def create_user_config(user_name: str, user_id: str) -> tuple[MOSConfig, General
"LongTermMemory": os.getenv("NEBULAR_LONGTERM_MEMORY", 1e6),
"UserMemory": os.getenv("NEBULAR_USER_MEMORY", 1e6),
},
"search_strategy": {
"bm25": bool(os.getenv("BM25_CALL", "false") == "true"),
"cot": bool(os.getenv("VEC_COT_CALL", "false") == "true"),
},
},
},
"act_mem": {}
Expand Down Expand Up @@ -936,10 +912,6 @@ def get_default_cube_config() -> GeneralMemCubeConfig | None:
"LongTermMemory": os.getenv("NEBULAR_LONGTERM_MEMORY", 1e6),
"UserMemory": os.getenv("NEBULAR_USER_MEMORY", 1e6),
},
"search_strategy": {
"bm25": bool(os.getenv("BM25_CALL", "false") == "true"),
"cot": bool(os.getenv("VEC_COT_CALL", "false") == "true"),
},
"mode": os.getenv("ASYNC_MODE", "sync"),
},
},
Expand Down
9 changes: 0 additions & 9 deletions src/memos/configs/mem_reader.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,19 +36,11 @@ def parse_datetime(cls, value):
description="whether remove example in memory extraction prompt to save token",
)

chat_chunker: dict[str, Any] = Field(
default=None, description="Configuration for the MemReader chat chunk strategy"
)


class SimpleStructMemReaderConfig(BaseMemReaderConfig):
"""SimpleStruct MemReader configuration class."""


class StrategyStructMemReaderConfig(BaseMemReaderConfig):
"""StrategyStruct MemReader configuration class."""


class MemReaderConfigFactory(BaseConfig):
"""Factory class for creating MemReader configurations."""

Expand All @@ -57,7 +49,6 @@ class MemReaderConfigFactory(BaseConfig):

backend_to_class: ClassVar[dict[str, Any]] = {
"simple_struct": SimpleStructMemReaderConfig,
"strategy_struct": StrategyStructMemReaderConfig,
}

@field_validator("backend")
Expand Down
7 changes: 0 additions & 7 deletions src/memos/configs/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,13 +184,6 @@ class TreeTextMemoryConfig(BaseTextMemoryConfig):
),
)

search_strategy: dict[str, bool] | None = Field(
default=None,
description=(
'Set search strategy for this memory configuration.{"bm25": true, "cot": false}'
),
)

mode: str | None = Field(
default="sync",
description=("whether use asynchronous mode in memory add"),
Expand Down
13 changes: 5 additions & 8 deletions src/memos/llms/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,15 @@ def clear_cache(cls):
logger.info("OpenAI LLM instance cache cleared")

@timed(log=True, log_prefix="OpenAI LLM")
def generate(self, messages: MessageList, **kwargs) -> str:
"""Generate a response from OpenAI LLM, optionally overriding generation params."""
temperature = kwargs.get("temperature", self.config.temperature)
max_tokens = kwargs.get("max_tokens", self.config.max_tokens)
top_p = kwargs.get("top_p", self.config.top_p)
def generate(self, messages: MessageList) -> str:
"""Generate a response from OpenAI LLM."""
response = self.client.chat.completions.create(
model=self.config.model_name_or_path,
messages=messages,
extra_body=self.config.extra_body,
temperature=temperature,
max_tokens=max_tokens,
top_p=top_p,
temperature=self.config.temperature,
max_tokens=self.config.max_tokens,
top_p=self.config.top_p,
)
logger.info(f"Response from OpenAI: {response.model_dump_json()}")
response_content = response.choices[0].message.content
Expand Down
2 changes: 0 additions & 2 deletions src/memos/mem_reader/factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
from memos.configs.mem_reader import MemReaderConfigFactory
from memos.mem_reader.base import BaseMemReader
from memos.mem_reader.simple_struct import SimpleStructMemReader
from memos.mem_reader.strategy_struct import StrategyStructMemReader
from memos.memos_tools.singleton import singleton_factory


Expand All @@ -12,7 +11,6 @@ class MemReaderFactory(BaseMemReader):

backend_to_class: ClassVar[dict[str, Any]] = {
"simple_struct": SimpleStructMemReader,
"strategy_struct": StrategyStructMemReader,
}

@classmethod
Expand Down
Loading