dev merge

This commit is contained in:
frdel 2024-12-08 20:29:37 +01:00
parent 050c78a3d9
commit 50173ced38
13 changed files with 261 additions and 178 deletions

View file

@ -5,165 +5,172 @@ import uuid
from collections import OrderedDict # Import OrderedDict
Type = Literal[
"agent",
"code_exe",
"error",
"hint",
"info",
"progress",
"response",
"tool",
"user",
"util",
"warning",
"agent",
"code_exe",
"error",
"hint",
"info",
"progress",
"response",
"tool",
"input",
"user",
"util",
"warning",
]
@dataclass
class LogItem:
log: "Log"
no: int
type: str
heading: str
content: str
temp: bool
kvps: Optional[OrderedDict] = None # Use OrderedDict for kvps
id: Optional[str] = None # Add id field
guid: str = ""
log: "Log"
no: int
type: str
heading: str
content: str
temp: bool
kvps: Optional[OrderedDict] = None # Use OrderedDict for kvps
id: Optional[str] = None # Add id field
guid: str = ""
def __post_init__(self):
self.guid = self.log.guid
def __post_init__(self):
self.guid = self.log.guid
def update(
self,
type: Type | None = None,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
**kwargs,
):
if self.guid == self.log.guid:
self.log.update_item(
self.no,
type=type,
heading=heading,
content=content,
kvps=kvps,
temp=temp,
**kwargs,
)
def update(
self,
type: Type | None = None,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
**kwargs,
):
if self.guid == self.log.guid:
self.log.update_item(
self.no,
type=type,
heading=heading,
content=content,
kvps=kvps,
temp=temp,
**kwargs,
)
def stream(self, heading: str | None = None, content: str | None = None, **kwargs):
if heading is not None:
self.update(heading=self.heading + heading)
if content is not None:
self.update(content=self.content + content)
def stream(self, heading: str | None = None, content: str | None = None, **kwargs):
if heading is not None:
self.update(heading=self.heading + heading)
if content is not None:
self.update(content=self.content + content)
for k, v in kwargs.items():
prev = self.kvps.get(k, "") if self.kvps else ""
self.update(**{k: prev + v})
for k, v in kwargs.items():
prev = self.kvps.get(k, "") if self.kvps else ""
self.update(**{k: prev + v})
def output(self):
return {
"no": self.no,
"id": self.id, # Include id in output
"type": self.type,
"heading": self.heading,
"content": self.content,
"temp": self.temp,
"kvps": self.kvps,
}
def output(self):
return {
"no": self.no,
"id": self.id, # Include id in output
"type": self.type,
"heading": self.heading,
"content": self.content,
"temp": self.temp,
"kvps": self.kvps,
}
class Log:
def __init__(self):
self.guid: str = str(uuid.uuid4())
self.updates: list[int] = []
self.logs: list[LogItem] = []
self.progress = ""
self.progress_no = 0
def __init__(self):
self.guid: str = str(uuid.uuid4())
self.updates: list[int] = []
self.logs: list[LogItem] = []
self.set_initial_progress()
def log(
self,
type: Type,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
id: Optional[str] = None, # Add id parameter
) -> LogItem:
# Use OrderedDict if kvps is provided
if kvps is not None:
kvps = OrderedDict(kvps)
item = LogItem(
log=self,
no=len(self.logs),
type=type,
heading=heading or "",
content=content or "",
kvps=kvps,
temp=temp or False,
id=id, # Pass id to LogItem
)
self.logs.append(item)
self.updates += [item.no]
if heading and item.no >= self.progress_no:
self.progress = heading
self.progress_no = item.no
return item
def log(
self,
type: Type,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
id: Optional[str] = None, # Add id parameter
) -> LogItem:
# Use OrderedDict if kvps is provided
if kvps is not None:
kvps = OrderedDict(kvps)
item = LogItem(
log=self,
no=len(self.logs),
type=type,
heading=heading or "",
content=content or "",
kvps=kvps,
temp=temp or False,
id=id, # Pass id to LogItem
)
self.logs.append(item)
self.updates += [item.no]
if heading and item.no >= self.progress_no:
self.set_progress(heading, item.no)
return item
def update_item(
self,
no: int,
type: str | None = None,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
**kwargs,
):
item = self.logs[no]
if type is not None:
item.type = type
if heading is not None:
item.heading = heading
if no >= self.progress_no:
self.progress = heading
self.progress_no = no
if content is not None:
item.content = content
if kvps is not None:
item.kvps = OrderedDict(kvps) # Use OrderedDict to keep the order
def update_item(
self,
no: int,
type: str | None = None,
heading: str | None = None,
content: str | None = None,
kvps: dict | None = None,
temp: bool | None = None,
**kwargs,
):
item = self.logs[no]
if type is not None:
item.type = type
if heading is not None:
item.heading = heading
if no >= self.progress_no:
self.set_progress(heading, no)
if content is not None:
item.content = content
if kvps is not None:
item.kvps = OrderedDict(kvps) # Use OrderedDict to keep the order
if temp is not None:
item.temp = temp
if temp is not None:
item.temp = temp
if kwargs:
if item.kvps is None:
item.kvps = OrderedDict() # Ensure kvps is an OrderedDict
for k, v in kwargs.items():
item.kvps[k] = v
if kwargs:
if item.kvps is None:
item.kvps = OrderedDict() # Ensure kvps is an OrderedDict
for k, v in kwargs.items():
item.kvps[k] = v
self.updates += [item.no]
self.updates += [item.no]
def output(self, start=None, end=None):
if start is None:
start = 0
if end is None:
end = len(self.updates)
def set_progress(self, progress: str, no: int = 0, active: bool = True):
self.progress = progress
if not no:
no = len(self.logs)
self.progress_no = no
self.progress_active = active
out = []
seen = set()
for update in self.updates[start:end]:
if update not in seen:
out.append(self.logs[update].output())
seen.add(update)
def set_initial_progress(self):
self.set_progress("Waiting for input", 0, False)
return out
def output(self, start=None, end=None):
if start is None:
start = 0
if end is None:
end = len(self.updates)
def reset(self):
self.guid = str(uuid.uuid4())
self.updates = []
self.logs = []
self.progress = ""
self.progress_no = 0
out = []
seen = set()
for update in self.updates[start:end]:
if update not in seen:
out.append(self.logs[update].output())
seen.add(update)
return out
def reset(self):
self.guid = str(uuid.uuid4())
self.updates = []
self.logs = []
self.set_initial_progress()

View file

@ -72,6 +72,13 @@ class Memory:
memory_subdir=memory_subdir,
)
@staticmethod
async def reload(agent: Agent):
memory_subdir = agent.config.memory_subdir or "default"
if Memory.index.get(memory_subdir):
del Memory.index[memory_subdir]
return await Memory.get(agent)
@staticmethod
def initialize(
log_item: LogItem | None,
@ -151,6 +158,9 @@ class Memory:
async def preload_knowledge(
self, log_item: LogItem | None, kn_dirs: list[str], memory_subdir: str
):
if log_item:
log_item.update(heading="Preloading knowledge...")
# db abs path
db_dir = Memory._abs_db_dir(memory_subdir)
@ -351,5 +361,12 @@ class Memory:
def get_timestamp():
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def get_memory_subdir_abs(agent: Agent) -> str:
return files.get_abs_path("memory", agent.config.memory_subdir or "default")
return files.get_abs_path("memory", agent.config.memory_subdir or "default")
def get_custom_knowledge_subdir_abs(agent: Agent) -> str:
for dir in agent.config.knowledge_subdirs:
if dir != "default":
return files.get_abs_path("knowledge", dir)
raise Exception("No custom knowledge subdir set")

View file

@ -166,8 +166,7 @@ def _deserialize_agents(
def _deserialize_log(data: dict[str, Any]) -> "Log":
log = Log()
log.guid = data.get("guid", str(uuid.uuid4()))
log.progress = "" # data.get("progress", "")
log.progress_no = data.get("progress_no", 0)
log.set_initial_progress()
# Deserialize the list of LogItem objects
i = 0

View file

@ -703,7 +703,7 @@ def get_default_settings() -> Settings:
chat_model_temperature=0,
chat_model_kwargs={},
chat_model_ctx_length=8192,
chat_model_ctx_history=0.65,
chat_model_ctx_history=0.7,
util_model_provider=ModelProvider.OPENAI.name,
util_model_name="gpt-4o-mini",
util_model_temperature=0,