Source code for camel.memories.records
# =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
# Licensed under the Apache License, Version 2.0 (the “License”);
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an “AS IS” BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# =========== Copyright 2023 @ CAMEL-AI.org. All Rights Reserved. ===========
from dataclasses import asdict
from typing import Any, ClassVar, Dict
from uuid import UUID, uuid4
from pydantic import BaseModel, ConfigDict, Field
from camel.messages import BaseMessage, FunctionCallingMessage, OpenAIMessage
from camel.types import OpenAIBackendRole
[docs]
class MemoryRecord(BaseModel):
r"""The basic message storing unit in the CAMEL memory system.
Attributes:
message (BaseMessage): The main content of the record.
role_at_backend (OpenAIBackendRole): An enumeration value representing
the role this message played at the OpenAI backend. Note that this
value is different from the :obj:`RoleType` used in the CAMEL role
playing system.
uuid (UUID, optional): A universally unique identifier for this record.
This is used to uniquely identify this record in the memory system.
If not given, it will be assigned with a random UUID.
extra_info (Dict[str, str], optional): A dictionary of additional
key-value pairs that provide more information. If not given, it
will be an empty `Dict`.
"""
model_config = ConfigDict(arbitrary_types_allowed=True)
message: BaseMessage
role_at_backend: OpenAIBackendRole
uuid: UUID = Field(default_factory=uuid4)
extra_info: Dict[str, str] = Field(default_factory=dict)
_MESSAGE_TYPES: ClassVar[dict] = {
"BaseMessage": BaseMessage,
"FunctionCallingMessage": FunctionCallingMessage,
}
[docs]
@classmethod
def from_dict(cls, record_dict: Dict[str, Any]) -> "MemoryRecord":
r"""Reconstruct a :obj:`MemoryRecord` from the input dict.
Args:
record_dict(Dict[str, Any]): A dict generated by :meth:`to_dict`.
"""
message_cls = cls._MESSAGE_TYPES[record_dict["message"]["__class__"]]
kwargs: Dict = record_dict["message"].copy()
kwargs.pop("__class__")
reconstructed_message = message_cls(**kwargs)
return cls(
uuid=UUID(record_dict["uuid"]),
message=reconstructed_message,
role_at_backend=record_dict["role_at_backend"],
extra_info=record_dict["extra_info"],
)
[docs]
def to_dict(self) -> Dict[str, Any]:
r"""Convert the :obj:`MemoryRecord` to a dict for serialization
purposes.
"""
return {
"uuid": str(self.uuid),
"message": {
"__class__": self.message.__class__.__name__,
**asdict(self.message),
},
"role_at_backend": self.role_at_backend,
"extra_info": self.extra_info,
}
[docs]
def to_openai_message(self) -> OpenAIMessage:
r"""Converts the record to an :obj:`OpenAIMessage` object."""
return self.message.to_openai_message(self.role_at_backend)
[docs]
class ContextRecord(BaseModel):
r"""The result of memory retrieving."""
memory_record: MemoryRecord
score: float