deepagents 0.0.10__py3-none-any.whl → 0.0.11rc1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
deepagents/prompts.py CHANGED
@@ -406,10 +406,17 @@ When NOT to use the task tool:
406
406
  FILESYSTEM_SYSTEM_PROMPT = """## Filesystem Tools `ls`, `read_file`, `write_file`, `edit_file`
407
407
 
408
408
  You have access to a local, private filesystem which you can interact with using these tools.
409
- - ls: list all files in the local filesystem
410
- - read_file: read a file from the local filesystem
411
- - write_file: write to a file in the local filesystem
412
- - edit_file: edit a file in the local filesystem"""
409
+
410
+ You also have access to a longterm filesystem in which you can store files that you want to keep around for longer than the current conversation.
411
+ In order to interact with the longterm filesystem, you can use those same tools, but filenames must be prefixed with the memories/ path.
412
+
413
+ - ls: list all files in the filesystem (local and longterm)
414
+ - read_file: read a file from the filesystem (local and longterm)
415
+ - write_file: write to a file in the filesystem (local and longterm)
416
+ - edit_file: edit a file in the filesystem (local and longterm)
417
+
418
+ Remember, to interact with the longterm filesystem, you must prefix the filename with the memories/ path.
419
+ """
413
420
 
414
421
  BASE_AGENT_PROMPT = """
415
422
  In order to complete the objective that the user asks of you, you have access to a number of standard tools.
deepagents/tools.py CHANGED
@@ -1,3 +1,4 @@
1
+ from re import L
1
2
  from langchain_core.tools import tool, InjectedToolCallId
2
3
  from langchain_core.messages import ToolMessage
3
4
  from langgraph.types import Command
@@ -11,7 +12,17 @@ from deepagents.prompts import (
11
12
  WRITE_FILE_TOOL_DESCRIPTION,
12
13
  EDIT_FILE_TOOL_DESCRIPTION,
13
14
  )
15
+ from ai_filesystem import FilesystemClient
16
+ import os
14
17
 
18
+ def has_memories_prefix(file_path: str) -> bool:
19
+ return file_path.startswith("memories/")
20
+
21
+ def append_memories_prefix(file_path: str) -> str:
22
+ return f"memories/{file_path}"
23
+
24
+ def strip_memories_prefix(file_path: str) -> str:
25
+ return file_path.replace("memories/", "")
15
26
 
16
27
  @tool(description=WRITE_TODOS_TOOL_DESCRIPTION)
17
28
  def write_todos(
@@ -30,7 +41,17 @@ def write_todos(
30
41
  @tool(description=LIST_FILES_TOOL_DESCRIPTION)
31
42
  def ls(state: Annotated[FilesystemState, InjectedState]) -> list[str]:
32
43
  """List all files"""
33
- return list(state.get("files", {}).keys())
44
+ files = []
45
+ files.extend(list(state.get("files", {}).keys()))
46
+ # Special handling for longterm filesystem
47
+ if os.getenv("LONGTERM_FILESYSTEM_NAME") and os.getenv("AGENT_FS_API_KEY"):
48
+ filesystem_client = FilesystemClient(
49
+ filesystem=os.getenv("LONGTERM_FILESYSTEM_NAME")
50
+ )
51
+ file_data_list = filesystem_client._list_files()
52
+ memories_files = [f"memories/{f.path}" for f in file_data_list]
53
+ files.extend(memories_files)
54
+ return files
34
55
 
35
56
 
36
57
  @tool(description=READ_FILE_TOOL_DESCRIPTION)
@@ -40,6 +61,15 @@ def read_file(
40
61
  offset: int = 0,
41
62
  limit: int = 2000,
42
63
  ) -> str:
64
+ # Special handling for longterm filesystem
65
+ if os.getenv("LONGTERM_FILESYSTEM_NAME") and os.getenv("AGENT_FS_API_KEY") and has_memories_prefix(file_path):
66
+ filesystem_client = FilesystemClient(
67
+ filesystem=os.getenv("LONGTERM_FILESYSTEM_NAME")
68
+ )
69
+ file_path = strip_memories_prefix(file_path)
70
+ content = filesystem_client.read_file(file_path)
71
+ return content
72
+
43
73
  mock_filesystem = state.get("files", {})
44
74
  if file_path not in mock_filesystem:
45
75
  return f"Error: File '{file_path}' not found"
@@ -85,14 +115,24 @@ def write_file(
85
115
  state: Annotated[FilesystemState, InjectedState],
86
116
  tool_call_id: Annotated[str, InjectedToolCallId],
87
117
  ) -> Command:
118
+ # Special handling for longterm filesystem
119
+ if os.getenv("LONGTERM_FILESYSTEM_NAME") and os.getenv("AGENT_FS_API_KEY") and has_memories_prefix(file_path):
120
+ filesystem_client = FilesystemClient(
121
+ filesystem=os.getenv("LONGTERM_FILESYSTEM_NAME")
122
+ )
123
+ short_file_path = strip_memories_prefix(file_path)
124
+ filesystem_client.create_file(short_file_path, content)
125
+ return Command(
126
+ update={
127
+ "messages": [ToolMessage(f"Updated longterm memories file {file_path}", tool_call_id=tool_call_id)]
128
+ }
129
+ )
130
+
88
131
  files = state.get("files", {})
89
- files[file_path] = content
90
132
  return Command(
91
133
  update={
92
134
  "files": files,
93
- "messages": [
94
- ToolMessage(f"Updated file {file_path}", tool_call_id=tool_call_id)
95
- ],
135
+ "messages": [ToolMessage(f"Updated file {file_path}", tool_call_id=tool_call_id)]
96
136
  }
97
137
  )
98
138
 
@@ -107,6 +147,19 @@ def edit_file(
107
147
  replace_all: bool = False,
108
148
  ) -> Union[Command, str]:
109
149
  """Write to a file."""
150
+ # Special handling for longterm filesystem
151
+ if os.getenv("LONGTERM_FILESYSTEM_NAME") and os.getenv("AGENT_FS_API_KEY") and has_memories_prefix(file_path):
152
+ filesystem_client = FilesystemClient(
153
+ filesystem=os.getenv("LONGTERM_FILESYSTEM_NAME")
154
+ )
155
+ short_file_path = strip_memories_prefix(file_path)
156
+ filesystem_client.edit_file(short_file_path, old_string, new_string, replace_all)
157
+ return Command(
158
+ update={
159
+ "messages": [ToolMessage(f"Successfully edited longterm memories file {file_path}", tool_call_id=tool_call_id)]
160
+ }
161
+ )
162
+
110
163
  mock_filesystem = state.get("files", {})
111
164
  # Check if file exists in mock filesystem
112
165
  if file_path not in mock_filesystem:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: deepagents
3
- Version: 0.0.10
3
+ Version: 0.0.11rc1
4
4
  Summary: General purpose 'deep agent' with sub-agent spawning, todo list capabilities, and mock file system. Built on LangGraph.
5
5
  License: MIT
6
6
  Requires-Python: <4.0,>=3.11
@@ -10,6 +10,7 @@ Requires-Dist: langgraph>=1.0.0a3
10
10
  Requires-Dist: langchain-anthropic>=0.1.23
11
11
  Requires-Dist: langchain>=1.0.0a10
12
12
  Requires-Dist: langgraph-prebuilt>=0.7.0a2
13
+ Requires-Dist: ai-filesystem>=0.1.4
13
14
  Provides-Extra: dev
14
15
  Requires-Dist: pytest; extra == "dev"
15
16
  Requires-Dist: pytest-cov; extra == "dev"
@@ -2,16 +2,16 @@ deepagents/__init__.py,sha256=fA_91ByxPb3e8aPfci43zOXrWz8ylh_CFQALo7EUKi8,312
2
2
  deepagents/graph.py,sha256=sLN0gWJma9dGgJI_RHDK-I1cEZMCo8nfxuF4a8vN7Po,6288
3
3
  deepagents/middleware.py,sha256=P2y1crsedTH1uZlKS3fpc7pd4jwz8dR8jnw7repUjLk,7254
4
4
  deepagents/model.py,sha256=VyRIkdeXJH8HqLrudTKucHpBTtrwMFTQGRlXBj0kUyo,155
5
- deepagents/prompts.py,sha256=mCnNGTRljfDUMXEfVRiBNGvhoc_wQjt0epiGMJkktgo,25150
5
+ deepagents/prompts.py,sha256=hiyiUriv-B3IQ0lwRqiJsvtgvwSS4wdeMNdXojHUisc,25603
6
6
  deepagents/state.py,sha256=8so3MgL-zRPYP8Ci_OuVg4wHrs5uAXCErKF1AjjCSt8,726
7
- deepagents/tools.py,sha256=KJw1lr6uO0Bw7mUNFmZ6lSuavJA_qx-3hJa3fjK5G6I,4776
7
+ deepagents/tools.py,sha256=kTS-O8jWJsUnX0tBl19Iyg8fSR2jhD8c7jDz_xNrw0I,7138
8
8
  deepagents/types.py,sha256=5KBSUPlWOnv9It3SnJCMHrOtp9Y4_NQGtGCp69JsEjE,694
9
- deepagents-0.0.10.dist-info/licenses/LICENSE,sha256=c__BaxUCK69leo2yEKynf8lWndu8iwYwge1CbyqAe-E,1071
9
+ deepagents-0.0.11rc1.dist-info/licenses/LICENSE,sha256=c__BaxUCK69leo2yEKynf8lWndu8iwYwge1CbyqAe-E,1071
10
10
  tests/test_deepagents.py,sha256=SwtOiJF4c1O3r_Q3AiM7XZu6tVq4uMIcZlnsfRjx8Ig,7648
11
11
  tests/test_hitl.py,sha256=B16ZFiyaVSOcDLz7mh1RTaQZ93EMTKOPUY-IEslkcfM,2460
12
12
  tests/test_middleware.py,sha256=3HYmTx0Jw4XTNJjqLYeyGS_QZzcqkFuKfShtajIDhF4,2146
13
13
  tests/utils.py,sha256=Ln_DYaMkwAVBo4XQ-QKwlCWP8zZYMenWTcFhsneoL0g,2913
14
- deepagents-0.0.10.dist-info/METADATA,sha256=Fc_-F5LiDzCdN-MdHbd-oo1Gyftb_Fq6xKsryZeqh5o,17292
15
- deepagents-0.0.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
- deepagents-0.0.10.dist-info/top_level.txt,sha256=_w9VMQtG4YDNg5A5eAeUre7dF7x7hk9zRpT9zsFaukY,17
17
- deepagents-0.0.10.dist-info/RECORD,,
14
+ deepagents-0.0.11rc1.dist-info/METADATA,sha256=nWOCcZljXdWY9tm3Gc_0Wyt7ZK0WScU0MhZY-jlJKuY,17331
15
+ deepagents-0.0.11rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
16
+ deepagents-0.0.11rc1.dist-info/top_level.txt,sha256=_w9VMQtG4YDNg5A5eAeUre7dF7x7hk9zRpT9zsFaukY,17
17
+ deepagents-0.0.11rc1.dist-info/RECORD,,