summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--agent.py26
-rw-r--r--client.py25
-rw-r--r--memory.py72
3 files changed, 117 insertions, 6 deletions
diff --git a/agent.py b/agent.py
index 41c7a7b..9dfd4ca 100644
--- a/agent.py
+++ b/agent.py
@@ -23,16 +23,14 @@ class Agent:
user_profile,
)
- self.working_memory = WorkingMemory(
- objective="Testing working memory",
- facts=["The user is testing the agent's working memory system."],
- notes=["This is temporary test data."],
- )
+ self.working_memory = WorkingMemory()
self.messages: list[dict[str, object]] = []
def chat(self, user_input: str) -> str:
-
+ if self.working_memory.objective is None:
+ self.working_memory.start_task(user_input)
+ print(f"\n[memory: {self.working_memory}]")
self.messages.append(
{
"role": "user",
@@ -90,6 +88,7 @@ class Agent:
else:
try:
result = tool.execute(call.arguments).content
+ self.working_memory.add_note(f"{call.name} returned: {result}")
except Exception as error:
result = f"Tool error: {error}"
@@ -101,3 +100,18 @@ class Agent:
}
)
raise RuntimeError("Tool call limit exceeded")
+
+ def end_task(self) -> None:
+ self.working_memory.end_task()
+
+ def start_task(self, objective: str) -> None:
+ self.working_memory.start_task(objective)
+
+ def pause_task(self) -> None:
+ self.working_memory.pause_task()
+
+ def resume_task(self) -> None:
+ self.working_memory.resume_task()
+
+ def complete_task(self) -> None:
+ self.working_memory.complete_task()
diff --git a/client.py b/client.py
index 0cbd91c..438f1fb 100644
--- a/client.py
+++ b/client.py
@@ -37,5 +37,30 @@ while True:
if user_input.lower() in {"exit", "quit"}:
break
+ match user_input:
+ case "/end":
+ agent.end_task()
+ print("[task ended]")
+ continue
+
+ case "/task":
+ print(f"\n[memory: {agent.working_memory}]\n")
+ continue
+
+ case "/pause":
+ agent.pause_task()
+ print("[task paused]")
+ continue
+
+ case "/resume":
+ agent.resume_task()
+ print("[task resumed]")
+ continue
+
+ case "/complete":
+ agent.complete_task()
+ print("[task completed]")
+ continue
+
answer = agent.chat(user_input)
print(f"Agent: {answer}")
diff --git a/memory.py b/memory.py
index 9269f94..6ba3368 100644
--- a/memory.py
+++ b/memory.py
@@ -1,4 +1,11 @@
from dataclasses import dataclass, field
+from enum import Enum
+
+
+class TaskStatus(Enum):
+ ACTIVE = "active"
+ PAUSED = "paused"
+ COMPLETED = "completed"
@dataclass
@@ -6,3 +13,68 @@ class WorkingMemory:
objective: str | None = None
facts: list[str] = field(default_factory=list)
notes: list[str] = field(default_factory=list)
+ status: TaskStatus | None = None
+
+ def __str__(self) -> str:
+ parts: list[str] = []
+
+ if self.objective:
+ parts.append(f"Objective: {self.objective}")
+
+ if self.status:
+ parts.append(f"Status: {self.status.value}")
+
+ if self.facts:
+ parts.append("Facts:")
+ parts.extend(f"- {fact}" for fact in self.facts)
+
+ if self.notes:
+ parts.append("Notes:")
+ parts.extend(f"- {note}" for note in self.notes)
+
+ return "\n".join(parts) if parts else "(empty)"
+
+ def set_objective(self, objective: str) -> None:
+ self.objective = objective
+
+ def add_fact(self, fact: str) -> None:
+ self.facts.append(fact)
+
+ def remove_fact(self, fact: str) -> None:
+ if fact in self.facts:
+ self.facts.remove(fact)
+
+ def add_note(self, note: str) -> None:
+ self.notes.append(note)
+
+ def remove_note(self, note: str) -> None:
+ if note in self.notes:
+ self.notes.remove(note)
+
+ def set_status(self, status: TaskStatus):
+ self.status = status
+
+ def clear(self) -> None:
+ self.objective = None
+ self.status = None
+ self.facts.clear()
+ self.notes.clear()
+
+ def start_task(self, objective: str) -> None:
+ self.clear()
+ self.objective = objective
+ self.set_status(TaskStatus.ACTIVE)
+
+ def pause_task(self) -> None:
+ if self.status == TaskStatus.ACTIVE:
+ self.set_status(TaskStatus.PAUSED)
+
+ def resume_task(self) -> None:
+ if self.status == TaskStatus.PAUSED:
+ self.set_status(TaskStatus.ACTIVE)
+
+ def complete_task(self) -> None:
+ self.set_status(TaskStatus.COMPLETED)
+
+ def end_task(self) -> None:
+ self.clear()