EvoScientist 0.0.1.dev4__py3-none-any.whl → 0.1.0rc2__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.
Files changed (37) hide show
  1. EvoScientist/EvoScientist.py +25 -61
  2. EvoScientist/__init__.py +0 -19
  3. EvoScientist/backends.py +0 -26
  4. EvoScientist/cli.py +1365 -480
  5. EvoScientist/middleware.py +7 -56
  6. EvoScientist/skills/clip/SKILL.md +253 -0
  7. EvoScientist/skills/clip/references/applications.md +207 -0
  8. EvoScientist/skills/langgraph-docs/SKILL.md +36 -0
  9. EvoScientist/skills/tensorboard/SKILL.md +629 -0
  10. EvoScientist/skills/tensorboard/references/integrations.md +638 -0
  11. EvoScientist/skills/tensorboard/references/profiling.md +545 -0
  12. EvoScientist/skills/tensorboard/references/visualization.md +620 -0
  13. EvoScientist/skills/vllm/SKILL.md +364 -0
  14. EvoScientist/skills/vllm/references/optimization.md +226 -0
  15. EvoScientist/skills/vllm/references/quantization.md +284 -0
  16. EvoScientist/skills/vllm/references/server-deployment.md +255 -0
  17. EvoScientist/skills/vllm/references/troubleshooting.md +447 -0
  18. EvoScientist/stream/__init__.py +0 -25
  19. EvoScientist/stream/utils.py +16 -23
  20. EvoScientist/tools.py +2 -75
  21. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc2.dist-info}/METADATA +8 -153
  22. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc2.dist-info}/RECORD +26 -24
  23. evoscientist-0.1.0rc2.dist-info/entry_points.txt +2 -0
  24. EvoScientist/config.py +0 -274
  25. EvoScientist/llm/__init__.py +0 -21
  26. EvoScientist/llm/models.py +0 -99
  27. EvoScientist/memory.py +0 -715
  28. EvoScientist/onboard.py +0 -725
  29. EvoScientist/paths.py +0 -44
  30. EvoScientist/skills_manager.py +0 -391
  31. EvoScientist/stream/display.py +0 -604
  32. EvoScientist/stream/events.py +0 -415
  33. EvoScientist/stream/state.py +0 -343
  34. evoscientist-0.0.1.dev4.dist-info/entry_points.txt +0 -5
  35. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc2.dist-info}/WHEEL +0 -0
  36. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc2.dist-info}/licenses/LICENSE +0 -0
  37. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc2.dist-info}/top_level.txt +0 -0
@@ -13,47 +13,34 @@ Usage:
13
13
  ...
14
14
  """
15
15
 
16
+ import os
16
17
  from datetime import datetime
17
18
  from pathlib import Path
18
19
 
19
20
  from deepagents import create_deep_agent
20
21
  from deepagents.backends import FilesystemBackend, CompositeBackend
22
+ from langchain.chat_models import init_chat_model
21
23
 
22
- from .backends import CustomSandboxBackend, MergedReadOnlyBackend
23
- from .config import get_effective_config, apply_config_to_env
24
- from .llm import get_chat_model
25
- from .middleware import create_skills_middleware, create_memory_middleware
24
+ from .backends import CustomSandboxBackend, ReadOnlyFilesystemBackend
25
+ from .middleware import create_skills_middleware
26
26
  from .prompts import RESEARCHER_INSTRUCTIONS, get_system_prompt
27
27
  from .utils import load_subagents
28
- from .tools import tavily_search, think_tool, skill_manager
29
- from .paths import (
30
- ensure_dirs,
31
- default_workspace_dir,
32
- MEMORY_DIR as _MEMORY_DIR_PATH,
33
- USER_SKILLS_DIR as _USER_SKILLS_DIR_PATH,
34
- )
28
+ from .tools import tavily_search, think_tool
35
29
 
36
30
  # =============================================================================
37
31
  # Configuration
38
32
  # =============================================================================
39
33
 
40
- # Load configuration from file/env/defaults
41
- _config = get_effective_config()
42
- apply_config_to_env(_config)
43
-
44
34
  # Backend mode: "sandbox" (with execute) or "filesystem" (read/write only)
45
35
  BACKEND_MODE = "sandbox"
46
36
 
47
- # Research limits (from config)
48
- MAX_CONCURRENT = _config.max_concurrent
49
- MAX_ITERATIONS = _config.max_iterations
37
+ # Research limits
38
+ MAX_CONCURRENT = 3 # Max parallel sub-agents
39
+ MAX_ITERATIONS = 3 # Max delegation rounds
50
40
 
51
41
  # Workspace settings
52
- ensure_dirs()
53
- WORKSPACE_DIR = str(default_workspace_dir())
54
- MEMORY_DIR = str(_MEMORY_DIR_PATH) # Shared across sessions (not per-session)
42
+ WORKSPACE_DIR = "./workspace/"
55
43
  SKILLS_DIR = str(Path(__file__).parent / "skills")
56
- USER_SKILLS_DIR = str(_USER_SKILLS_DIR_PATH)
57
44
  SUBAGENTS_CONFIG = Path(__file__).parent / "subagent.yaml"
58
45
 
59
46
  # =============================================================================
@@ -69,10 +56,10 @@ SYSTEM_PROMPT = get_system_prompt(
69
56
  max_iterations=MAX_ITERATIONS,
70
57
  )
71
58
 
72
- # Initialize chat model using the LLM module (respects config settings)
73
- chat_model = get_chat_model(
74
- model=_config.model,
75
- provider=_config.provider,
59
+ # Initialize chat model
60
+ chat_model = init_chat_model(
61
+ model="claude-sonnet-4-5-20250929",
62
+ model_provider="anthropic",
76
63
  # thinking={"type": "enabled", "budget_tokens": 2000},
77
64
  )
78
65
 
@@ -89,25 +76,16 @@ else:
89
76
  virtual_mode=True,
90
77
  )
91
78
 
92
- # Skills backend: merge user-installed (./skills/) and system (package) skills
93
- _skills_backend = MergedReadOnlyBackend(
94
- primary_dir=USER_SKILLS_DIR, # user-installed, takes priority
95
- secondary_dir=SKILLS_DIR, # package built-in, fallback
96
- )
97
-
98
- # Memory backend: persistent filesystem for long-term memory (shared across sessions)
99
- _memory_backend = FilesystemBackend(
100
- root_dir=MEMORY_DIR,
79
+ # Skills backend: read-only access to ./skills/
80
+ _skills_backend = ReadOnlyFilesystemBackend(
81
+ root_dir=SKILLS_DIR,
101
82
  virtual_mode=True,
102
83
  )
103
84
 
104
- # Composite backend: workspace as default, skills and memory mounted
85
+ # Composite backend: workspace as default, skills mounted at /skills/
105
86
  backend = CompositeBackend(
106
87
  default=_workspace_backend,
107
- routes={
108
- "/skills/": _skills_backend,
109
- "/memory/": _memory_backend,
110
- },
88
+ routes={"/skills/": _skills_backend},
111
89
  )
112
90
 
113
91
  tool_registry = {
@@ -129,13 +107,10 @@ subagents = load_subagents(
129
107
  _AGENT_KWARGS = dict(
130
108
  name="EvoScientist",
131
109
  model=chat_model,
132
- tools=[think_tool, skill_manager],
110
+ tools=[think_tool],
133
111
  backend=backend,
134
112
  subagents=subagents,
135
- middleware=[
136
- create_memory_middleware(MEMORY_DIR, extraction_model=chat_model),
137
- create_skills_middleware(SKILLS_DIR, user_skills_dir=USER_SKILLS_DIR),
138
- ],
113
+ middleware=[create_skills_middleware(SKILLS_DIR, WORKSPACE_DIR)],
139
114
  system_prompt=SYSTEM_PROMPT,
140
115
  )
141
116
 
@@ -149,7 +124,7 @@ def create_cli_agent(workspace_dir: str | None = None):
149
124
  Args:
150
125
  workspace_dir: Optional per-session workspace directory. If provided,
151
126
  creates a fresh backend rooted at this path. If None, uses the
152
- module-level default backend (./workspace).
127
+ module-level default backend (./workspace/).
153
128
  """
154
129
  from langgraph.checkpoint.memory import InMemorySaver # type: ignore[import-untyped]
155
130
 
@@ -159,26 +134,15 @@ def create_cli_agent(workspace_dir: str | None = None):
159
134
  virtual_mode=True,
160
135
  timeout=300,
161
136
  )
162
- sk_backend = MergedReadOnlyBackend(
163
- primary_dir=USER_SKILLS_DIR,
164
- secondary_dir=SKILLS_DIR,
165
- )
166
- # Memory always uses SHARED directory (not per-session) for cross-session persistence
167
- mem_backend = FilesystemBackend(
168
- root_dir=MEMORY_DIR,
137
+ sk_backend = ReadOnlyFilesystemBackend(
138
+ root_dir=SKILLS_DIR,
169
139
  virtual_mode=True,
170
140
  )
171
141
  be = CompositeBackend(
172
142
  default=ws_backend,
173
- routes={
174
- "/skills/": sk_backend,
175
- "/memory/": mem_backend,
176
- },
143
+ routes={"/skills/": sk_backend},
177
144
  )
178
- mw = [
179
- create_memory_middleware(MEMORY_DIR, extraction_model=chat_model),
180
- create_skills_middleware(SKILLS_DIR, user_skills_dir=USER_SKILLS_DIR),
181
- ]
145
+ mw = [create_skills_middleware(SKILLS_DIR, workspace_dir)]
182
146
  kwargs = dict(
183
147
  _AGENT_KWARGS,
184
148
  backend=be,
EvoScientist/__init__.py CHANGED
@@ -1,14 +1,6 @@
1
1
  """EvoScientist Agent — AI-powered research & code execution."""
2
2
 
3
3
  from .backends import CustomSandboxBackend, ReadOnlyFilesystemBackend
4
- from .config import (
5
- EvoScientistConfig,
6
- load_config,
7
- save_config,
8
- get_effective_config,
9
- get_config_path,
10
- )
11
- from .llm import get_chat_model, MODELS, list_models, DEFAULT_MODEL
12
4
  from .middleware import create_skills_middleware
13
5
  from .prompts import get_system_prompt, RESEARCHER_INSTRUCTIONS
14
6
  from .tools import tavily_search, think_tool
@@ -21,17 +13,6 @@ __all__ = [
21
13
  # Backends
22
14
  "CustomSandboxBackend",
23
15
  "ReadOnlyFilesystemBackend",
24
- # Configuration
25
- "EvoScientistConfig",
26
- "load_config",
27
- "save_config",
28
- "get_effective_config",
29
- "get_config_path",
30
- # LLM
31
- "get_chat_model",
32
- "MODELS",
33
- "list_models",
34
- "DEFAULT_MODEL",
35
16
  # Middleware
36
17
  "create_skills_middleware",
37
18
  # Prompts
EvoScientist/backends.py CHANGED
@@ -9,8 +9,6 @@ from deepagents.backends import FilesystemBackend
9
9
  from deepagents.backends.filesystem import WriteResult, EditResult
10
10
  from deepagents.backends.protocol import (
11
11
  ExecuteResponse,
12
- FileDownloadResponse,
13
- FileUploadResponse,
14
12
  SandboxBackendProtocol,
15
13
  )
16
14
 
@@ -225,30 +223,6 @@ class MergedReadOnlyBackend:
225
223
  async def aedit(self, file_path: str, old_string: str, new_string: str, replace_all: bool = False) -> EditResult:
226
224
  return self.edit(file_path, old_string, new_string, replace_all)
227
225
 
228
- # -- download / upload (required by BackendProtocol) --
229
-
230
- def download_files(self, paths: list[str]) -> list[FileDownloadResponse]:
231
- """Download files, trying primary then secondary."""
232
- responses: list[FileDownloadResponse] = []
233
- for path in paths:
234
- resp = self._primary.download_files([path])[0]
235
- if resp.error is not None:
236
- resp = self._secondary.download_files([path])[0]
237
- responses.append(resp)
238
- return responses
239
-
240
- async def adownload_files(self, paths: list[str]) -> list[FileDownloadResponse]:
241
- return self.download_files(paths)
242
-
243
- def upload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]:
244
- return [
245
- FileUploadResponse(path=path, error="permission_denied")
246
- for path, _ in files
247
- ]
248
-
249
- async def aupload_files(self, files: list[tuple[str, bytes]]) -> list[FileUploadResponse]:
250
- return self.upload_files(files)
251
-
252
226
 
253
227
  class CustomSandboxBackend(FilesystemBackend, SandboxBackendProtocol):
254
228
  """