EvoScientist 0.0.1.dev4__py3-none-any.whl → 0.1.0rc1__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.
- EvoScientist/EvoScientist.py +26 -62
- EvoScientist/__init__.py +0 -19
- EvoScientist/backends.py +0 -26
- EvoScientist/cli.py +1111 -498
- EvoScientist/middleware.py +8 -61
- EvoScientist/stream/__init__.py +0 -25
- EvoScientist/stream/utils.py +16 -23
- EvoScientist/tools.py +2 -75
- evoscientist-0.1.0rc1.dist-info/METADATA +199 -0
- evoscientist-0.1.0rc1.dist-info/RECORD +21 -0
- evoscientist-0.1.0rc1.dist-info/entry_points.txt +2 -0
- EvoScientist/config.py +0 -274
- EvoScientist/llm/__init__.py +0 -21
- EvoScientist/llm/models.py +0 -99
- EvoScientist/memory.py +0 -715
- EvoScientist/onboard.py +0 -725
- EvoScientist/paths.py +0 -44
- EvoScientist/skills/accelerate/SKILL.md +0 -332
- EvoScientist/skills/accelerate/references/custom-plugins.md +0 -453
- EvoScientist/skills/accelerate/references/megatron-integration.md +0 -489
- EvoScientist/skills/accelerate/references/performance.md +0 -525
- EvoScientist/skills/bitsandbytes/SKILL.md +0 -411
- EvoScientist/skills/bitsandbytes/references/memory-optimization.md +0 -521
- EvoScientist/skills/bitsandbytes/references/qlora-training.md +0 -521
- EvoScientist/skills/bitsandbytes/references/quantization-formats.md +0 -447
- EvoScientist/skills/find-skills/SKILL.md +0 -133
- EvoScientist/skills/find-skills/scripts/install_skill.py +0 -211
- EvoScientist/skills/flash-attention/SKILL.md +0 -367
- EvoScientist/skills/flash-attention/references/benchmarks.md +0 -215
- EvoScientist/skills/flash-attention/references/transformers-integration.md +0 -293
- EvoScientist/skills/llama-cpp/SKILL.md +0 -258
- EvoScientist/skills/llama-cpp/references/optimization.md +0 -89
- EvoScientist/skills/llama-cpp/references/quantization.md +0 -213
- EvoScientist/skills/llama-cpp/references/server.md +0 -125
- EvoScientist/skills/lm-evaluation-harness/SKILL.md +0 -490
- EvoScientist/skills/lm-evaluation-harness/references/api-evaluation.md +0 -490
- EvoScientist/skills/lm-evaluation-harness/references/benchmark-guide.md +0 -488
- EvoScientist/skills/lm-evaluation-harness/references/custom-tasks.md +0 -602
- EvoScientist/skills/lm-evaluation-harness/references/distributed-eval.md +0 -519
- EvoScientist/skills/ml-paper-writing/SKILL.md +0 -937
- EvoScientist/skills/ml-paper-writing/references/checklists.md +0 -361
- EvoScientist/skills/ml-paper-writing/references/citation-workflow.md +0 -562
- EvoScientist/skills/ml-paper-writing/references/reviewer-guidelines.md +0 -367
- EvoScientist/skills/ml-paper-writing/references/sources.md +0 -159
- EvoScientist/skills/ml-paper-writing/references/writing-guide.md +0 -476
- EvoScientist/skills/ml-paper-writing/templates/README.md +0 -251
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/README.md +0 -534
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +0 -144
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +0 -952
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +0 -111
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +0 -1493
- EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +0 -315
- EvoScientist/skills/ml-paper-writing/templates/acl/README.md +0 -50
- EvoScientist/skills/ml-paper-writing/templates/acl/acl.sty +0 -312
- EvoScientist/skills/ml-paper-writing/templates/acl/acl_latex.tex +0 -377
- EvoScientist/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +0 -101
- EvoScientist/skills/ml-paper-writing/templates/acl/acl_natbib.bst +0 -1940
- EvoScientist/skills/ml-paper-writing/templates/acl/anthology.bib.txt +0 -26
- EvoScientist/skills/ml-paper-writing/templates/acl/custom.bib +0 -70
- EvoScientist/skills/ml-paper-writing/templates/acl/formatting.md +0 -326
- EvoScientist/skills/ml-paper-writing/templates/colm2025/README.md +0 -3
- EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +0 -11
- EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +0 -1440
- EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
- EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +0 -218
- EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +0 -305
- EvoScientist/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +0 -485
- EvoScientist/skills/ml-paper-writing/templates/colm2025/math_commands.tex +0 -508
- EvoScientist/skills/ml-paper-writing/templates/colm2025/natbib.sty +0 -1246
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +0 -485
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +0 -24
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +0 -1440
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +0 -246
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +0 -414
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +0 -508
- EvoScientist/skills/ml-paper-writing/templates/iclr2026/natbib.sty +0 -1246
- EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithm.sty +0 -79
- EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +0 -201
- EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.bib +0 -75
- EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
- EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.tex +0 -662
- EvoScientist/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +0 -864
- EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.bst +0 -1443
- EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.sty +0 -767
- EvoScientist/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
- EvoScientist/skills/ml-paper-writing/templates/neurips2025/Makefile +0 -36
- EvoScientist/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +0 -53
- EvoScientist/skills/ml-paper-writing/templates/neurips2025/main.tex +0 -38
- EvoScientist/skills/ml-paper-writing/templates/neurips2025/neurips.sty +0 -382
- EvoScientist/skills/peft/SKILL.md +0 -431
- EvoScientist/skills/peft/references/advanced-usage.md +0 -514
- EvoScientist/skills/peft/references/troubleshooting.md +0 -480
- EvoScientist/skills/ray-data/SKILL.md +0 -326
- EvoScientist/skills/ray-data/references/integration.md +0 -82
- EvoScientist/skills/ray-data/references/transformations.md +0 -83
- EvoScientist/skills/skill-creator/LICENSE.txt +0 -202
- EvoScientist/skills/skill-creator/SKILL.md +0 -356
- EvoScientist/skills/skill-creator/references/output-patterns.md +0 -82
- EvoScientist/skills/skill-creator/references/workflows.md +0 -28
- EvoScientist/skills/skill-creator/scripts/init_skill.py +0 -303
- EvoScientist/skills/skill-creator/scripts/package_skill.py +0 -110
- EvoScientist/skills/skill-creator/scripts/quick_validate.py +0 -95
- EvoScientist/skills_manager.py +0 -391
- EvoScientist/stream/display.py +0 -604
- EvoScientist/stream/events.py +0 -415
- EvoScientist/stream/state.py +0 -343
- evoscientist-0.0.1.dev4.dist-info/METADATA +0 -367
- evoscientist-0.0.1.dev4.dist-info/RECORD +0 -117
- evoscientist-0.0.1.dev4.dist-info/entry_points.txt +0 -5
- {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc1.dist-info}/WHEEL +0 -0
- {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc1.dist-info}/licenses/LICENSE +0 -0
- {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc1.dist-info}/top_level.txt +0 -0
EvoScientist/middleware.py
CHANGED
|
@@ -1,80 +1,27 @@
|
|
|
1
1
|
"""Middleware configuration for the EvoScientist agent."""
|
|
2
2
|
|
|
3
|
-
from __future__ import annotations
|
|
4
|
-
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from typing import TYPE_CHECKING
|
|
7
|
-
|
|
8
3
|
from deepagents.backends import FilesystemBackend
|
|
9
4
|
from deepagents.middleware.skills import SkillsMiddleware
|
|
10
5
|
|
|
11
|
-
from .backends import MergedReadOnlyBackend
|
|
12
|
-
from .memory import EvoMemoryMiddleware
|
|
13
|
-
from .paths import MEMORY_DIR as _DEFAULT_MEMORY_DIR
|
|
14
|
-
|
|
15
|
-
if TYPE_CHECKING:
|
|
16
|
-
from langchain.chat_models import BaseChatModel
|
|
17
|
-
|
|
18
|
-
_DEFAULT_SKILLS_DIR = str(Path(__file__).parent / "skills")
|
|
19
|
-
|
|
20
6
|
|
|
21
7
|
def create_skills_middleware(
|
|
22
|
-
skills_dir: str =
|
|
23
|
-
workspace_dir: str = "
|
|
24
|
-
user_skills_dir: str | None = None,
|
|
8
|
+
skills_dir: str = "./skills/",
|
|
9
|
+
workspace_dir: str = "./workspace/",
|
|
25
10
|
) -> SkillsMiddleware:
|
|
26
11
|
"""Create a SkillsMiddleware that loads skills.
|
|
27
12
|
|
|
28
|
-
|
|
29
|
-
|
|
13
|
+
All skills (system and user-installed) live in ./skills/.
|
|
14
|
+
The --user flag in install_skill.py also installs to ./skills/.
|
|
30
15
|
|
|
31
16
|
Args:
|
|
32
|
-
skills_dir: Path to the
|
|
33
|
-
workspace_dir:
|
|
34
|
-
user_skills_dir: Optional explicit path for user-installed skills. If set,
|
|
35
|
-
this path is used directly instead of {workspace_dir}/skills.
|
|
17
|
+
skills_dir: Path to the skills directory
|
|
18
|
+
workspace_dir: Unused, kept for API compatibility
|
|
36
19
|
|
|
37
20
|
Returns:
|
|
38
21
|
Configured SkillsMiddleware instance
|
|
39
22
|
"""
|
|
40
|
-
|
|
41
|
-
user_skills_dir = str(Path(workspace_dir) / "skills")
|
|
42
|
-
merged = MergedReadOnlyBackend(
|
|
43
|
-
primary_dir=user_skills_dir,
|
|
44
|
-
secondary_dir=skills_dir,
|
|
45
|
-
)
|
|
23
|
+
skills_backend = FilesystemBackend(root_dir=skills_dir, virtual_mode=True)
|
|
46
24
|
return SkillsMiddleware(
|
|
47
|
-
backend=
|
|
25
|
+
backend=skills_backend,
|
|
48
26
|
sources=["/"],
|
|
49
27
|
)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def create_memory_middleware(
|
|
53
|
-
memory_dir: str = str(_DEFAULT_MEMORY_DIR),
|
|
54
|
-
extraction_model: BaseChatModel | None = None,
|
|
55
|
-
trigger: tuple[str, int] = ("messages", 20),
|
|
56
|
-
) -> EvoMemoryMiddleware:
|
|
57
|
-
"""Create an EvoMemoryMiddleware for long-term memory.
|
|
58
|
-
|
|
59
|
-
Uses a FilesystemBackend rooted at ``memory_dir`` so that memory
|
|
60
|
-
persists across threads and sessions.
|
|
61
|
-
|
|
62
|
-
Args:
|
|
63
|
-
memory_dir: Path to the shared memory directory (not per-session).
|
|
64
|
-
extraction_model: Chat model for auto-extraction (optional; if None,
|
|
65
|
-
only prompt-guided manual memory updates via edit_file will work).
|
|
66
|
-
trigger: When to auto-extract. Default: every 20 human messages.
|
|
67
|
-
|
|
68
|
-
Returns:
|
|
69
|
-
Configured EvoMemoryMiddleware instance.
|
|
70
|
-
"""
|
|
71
|
-
memory_backend = FilesystemBackend(
|
|
72
|
-
root_dir=memory_dir,
|
|
73
|
-
virtual_mode=True,
|
|
74
|
-
)
|
|
75
|
-
return EvoMemoryMiddleware(
|
|
76
|
-
backend=memory_backend,
|
|
77
|
-
memory_path="/MEMORY.md",
|
|
78
|
-
extraction_model=extraction_model,
|
|
79
|
-
trigger=trigger,
|
|
80
|
-
)
|
EvoScientist/stream/__init__.py
CHANGED
|
@@ -6,9 +6,6 @@ Provides:
|
|
|
6
6
|
- ToolCallTracker: Incremental JSON parsing for tool parameters
|
|
7
7
|
- ToolResultFormatter: Content-aware result formatting with Rich
|
|
8
8
|
- Utility functions and constants
|
|
9
|
-
- SubAgentState / StreamState: Stream state tracking
|
|
10
|
-
- stream_agent_events: Async event generator
|
|
11
|
-
- Display functions: Rich rendering for streaming and final output
|
|
12
9
|
"""
|
|
13
10
|
|
|
14
11
|
from .emitter import StreamEventEmitter, StreamEvent
|
|
@@ -28,15 +25,6 @@ from .utils import (
|
|
|
28
25
|
truncate_with_line_hint,
|
|
29
26
|
get_status_symbol,
|
|
30
27
|
)
|
|
31
|
-
from .state import SubAgentState, StreamState, _parse_todo_items, _build_todo_stats
|
|
32
|
-
from .events import stream_agent_events
|
|
33
|
-
from .display import (
|
|
34
|
-
console,
|
|
35
|
-
formatter,
|
|
36
|
-
format_tool_result_compact,
|
|
37
|
-
create_streaming_display,
|
|
38
|
-
display_final_results,
|
|
39
|
-
)
|
|
40
28
|
|
|
41
29
|
__all__ = [
|
|
42
30
|
# Emitter
|
|
@@ -62,17 +50,4 @@ __all__ = [
|
|
|
62
50
|
"count_lines",
|
|
63
51
|
"truncate_with_line_hint",
|
|
64
52
|
"get_status_symbol",
|
|
65
|
-
# State
|
|
66
|
-
"SubAgentState",
|
|
67
|
-
"StreamState",
|
|
68
|
-
"_parse_todo_items",
|
|
69
|
-
"_build_todo_stats",
|
|
70
|
-
# Events
|
|
71
|
-
"stream_agent_events",
|
|
72
|
-
# Display
|
|
73
|
-
"console",
|
|
74
|
-
"formatter",
|
|
75
|
-
"format_tool_result_compact",
|
|
76
|
-
"create_streaming_display",
|
|
77
|
-
"display_final_results",
|
|
78
53
|
]
|
EvoScientist/stream/utils.py
CHANGED
|
@@ -114,40 +114,34 @@ def format_tool_compact(name: str, args: dict | None) -> str:
|
|
|
114
114
|
if name_lower == "execute":
|
|
115
115
|
cmd = args.get("command", "")
|
|
116
116
|
if len(cmd) > 50:
|
|
117
|
-
cmd = cmd[:47] + "
|
|
117
|
+
cmd = cmd[:47] + "..."
|
|
118
118
|
return f"execute({cmd})"
|
|
119
119
|
|
|
120
|
-
# File operations
|
|
120
|
+
# File operations
|
|
121
121
|
if name_lower == "read_file":
|
|
122
|
-
path = args.get("path", "")
|
|
123
|
-
|
|
124
|
-
return "Reading memory"
|
|
125
|
-
return f"read_file({_shorten_path(path)})"
|
|
122
|
+
path = _shorten_path(args.get("path", ""))
|
|
123
|
+
return f"read_file({path})"
|
|
126
124
|
|
|
127
125
|
if name_lower == "write_file":
|
|
128
|
-
path = args.get("path", "")
|
|
129
|
-
|
|
130
|
-
return "Updating memory"
|
|
131
|
-
return f"write_file({_shorten_path(path)})"
|
|
126
|
+
path = _shorten_path(args.get("path", ""))
|
|
127
|
+
return f"write_file({path})"
|
|
132
128
|
|
|
133
129
|
if name_lower == "edit_file":
|
|
134
|
-
path = args.get("path", "")
|
|
135
|
-
|
|
136
|
-
return "Updating memory"
|
|
137
|
-
return f"edit_file({_shorten_path(path)})"
|
|
130
|
+
path = _shorten_path(args.get("path", ""))
|
|
131
|
+
return f"edit_file({path})"
|
|
138
132
|
|
|
139
133
|
# Search operations
|
|
140
134
|
if name_lower == "glob":
|
|
141
135
|
pattern = args.get("pattern", "")
|
|
142
136
|
if len(pattern) > 40:
|
|
143
|
-
pattern = pattern[:37] + "
|
|
137
|
+
pattern = pattern[:37] + "..."
|
|
144
138
|
return f"glob({pattern})"
|
|
145
139
|
|
|
146
140
|
if name_lower == "grep":
|
|
147
141
|
pattern = args.get("pattern", "")
|
|
148
142
|
path = args.get("path", ".")
|
|
149
143
|
if len(pattern) > 30:
|
|
150
|
-
pattern = pattern[:27] + "
|
|
144
|
+
pattern = pattern[:27] + "..."
|
|
151
145
|
return f"grep({pattern}, {path})"
|
|
152
146
|
|
|
153
147
|
# Directory listing
|
|
@@ -169,17 +163,16 @@ def format_tool_compact(name: str, args: dict | None) -> str:
|
|
|
169
163
|
if name_lower == "task":
|
|
170
164
|
sa_type = args.get("subagent_type", "").strip()
|
|
171
165
|
task_desc = args.get("description", args.get("task", "")).strip()
|
|
172
|
-
task_desc = task_desc.split("\n")[0].strip() if task_desc else ""
|
|
173
166
|
if sa_type:
|
|
174
167
|
if task_desc:
|
|
175
168
|
if len(task_desc) > 50:
|
|
176
|
-
task_desc = task_desc[:47] + "
|
|
169
|
+
task_desc = task_desc[:47] + "..."
|
|
177
170
|
return f"Cooking with {sa_type} — {task_desc}"
|
|
178
171
|
return f"Cooking with {sa_type}"
|
|
179
172
|
# Fallback if no subagent_type
|
|
180
173
|
if task_desc:
|
|
181
174
|
if len(task_desc) > 50:
|
|
182
|
-
task_desc = task_desc[:47] + "
|
|
175
|
+
task_desc = task_desc[:47] + "..."
|
|
183
176
|
return f"Cooking with sub-agent — {task_desc}"
|
|
184
177
|
return "Cooking with sub-agent"
|
|
185
178
|
|
|
@@ -192,14 +185,14 @@ def format_tool_compact(name: str, args: dict | None) -> str:
|
|
|
192
185
|
if name_lower in ("tavily_search", "internet_search"):
|
|
193
186
|
query = args.get("query", "")
|
|
194
187
|
if len(query) > 40:
|
|
195
|
-
query = query[:37] + "
|
|
188
|
+
query = query[:37] + "..."
|
|
196
189
|
return f"{name}({query})"
|
|
197
190
|
|
|
198
191
|
# Think/reflection
|
|
199
192
|
if name_lower == "think_tool":
|
|
200
193
|
reflection = args.get("reflection", "")
|
|
201
194
|
if len(reflection) > 40:
|
|
202
|
-
reflection = reflection[:37] + "
|
|
195
|
+
reflection = reflection[:37] + "..."
|
|
203
196
|
return f"think_tool({reflection})"
|
|
204
197
|
|
|
205
198
|
# Default: show first few params
|
|
@@ -207,12 +200,12 @@ def format_tool_compact(name: str, args: dict | None) -> str:
|
|
|
207
200
|
for k, v in list(args.items())[:2]:
|
|
208
201
|
v_str = str(v)
|
|
209
202
|
if len(v_str) > 20:
|
|
210
|
-
v_str = v_str[:17] + "
|
|
203
|
+
v_str = v_str[:17] + "..."
|
|
211
204
|
params.append(f"{k}={v_str}")
|
|
212
205
|
|
|
213
206
|
params_str = ", ".join(params)
|
|
214
207
|
if len(params_str) > 50:
|
|
215
|
-
params_str = params_str[:47] + "
|
|
208
|
+
params_str = params_str[:47] + "..."
|
|
216
209
|
|
|
217
210
|
return f"{name}({params_str})"
|
|
218
211
|
|
EvoScientist/tools.py
CHANGED
|
@@ -16,16 +16,7 @@ from typing_extensions import Annotated
|
|
|
16
16
|
|
|
17
17
|
load_dotenv(override=True)
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
_tavily_client = None
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _get_tavily_client() -> TavilyClient:
|
|
24
|
-
"""Get or create the Tavily client (lazy initialization)."""
|
|
25
|
-
global _tavily_client
|
|
26
|
-
if _tavily_client is None:
|
|
27
|
-
_tavily_client = TavilyClient()
|
|
28
|
-
return _tavily_client
|
|
19
|
+
tavily_client = TavilyClient()
|
|
29
20
|
|
|
30
21
|
|
|
31
22
|
async def fetch_webpage_content(url: str, timeout: float = 10.0) -> str:
|
|
@@ -76,7 +67,7 @@ async def tavily_search(
|
|
|
76
67
|
"""
|
|
77
68
|
|
|
78
69
|
def _sync_search() -> dict:
|
|
79
|
-
return
|
|
70
|
+
return tavily_client.search(
|
|
80
71
|
query,
|
|
81
72
|
max_results=max_results,
|
|
82
73
|
topic=topic,
|
|
@@ -115,70 +106,6 @@ async def tavily_search(
|
|
|
115
106
|
return f"Search failed: {str(e)}"
|
|
116
107
|
|
|
117
108
|
|
|
118
|
-
@tool(parse_docstring=True)
|
|
119
|
-
def skill_manager(
|
|
120
|
-
action: Literal["install", "list", "uninstall"],
|
|
121
|
-
source: str = "",
|
|
122
|
-
name: str = "",
|
|
123
|
-
) -> str:
|
|
124
|
-
"""Manage user skills: install, list, or uninstall.
|
|
125
|
-
|
|
126
|
-
Use this tool when the user asks to:
|
|
127
|
-
- Install a skill (action="install", source required)
|
|
128
|
-
- List installed skills (action="list")
|
|
129
|
-
- Uninstall a skill (action="uninstall", name required)
|
|
130
|
-
|
|
131
|
-
Supported sources for install:
|
|
132
|
-
- Local path: "./my-skill" or "/path/to/skill"
|
|
133
|
-
- GitHub URL: "https://github.com/owner/repo/tree/main/skill-name"
|
|
134
|
-
- GitHub shorthand: "owner/repo@skill-name"
|
|
135
|
-
|
|
136
|
-
Args:
|
|
137
|
-
action: One of "install", "list", or "uninstall"
|
|
138
|
-
source: For install - local path or GitHub URL/shorthand
|
|
139
|
-
name: For uninstall - skill name to remove
|
|
140
|
-
|
|
141
|
-
Returns:
|
|
142
|
-
Result message
|
|
143
|
-
"""
|
|
144
|
-
from .skills_manager import install_skill, list_skills, uninstall_skill
|
|
145
|
-
|
|
146
|
-
if action == "install":
|
|
147
|
-
if not source:
|
|
148
|
-
return "Error: 'source' is required for install action"
|
|
149
|
-
result = install_skill(source)
|
|
150
|
-
if result["success"]:
|
|
151
|
-
return (
|
|
152
|
-
f"Successfully installed skill: {result['name']}\n"
|
|
153
|
-
f"Description: {result.get('description', '(none)')}\n"
|
|
154
|
-
f"Path: {result['path']}\n\n"
|
|
155
|
-
f"Use load_skill to activate it."
|
|
156
|
-
)
|
|
157
|
-
else:
|
|
158
|
-
return f"Failed to install skill: {result['error']}"
|
|
159
|
-
|
|
160
|
-
elif action == "list":
|
|
161
|
-
skills = list_skills(include_system=False)
|
|
162
|
-
if not skills:
|
|
163
|
-
return "No user skills installed. Use action='install' to add skills."
|
|
164
|
-
lines = [f"Installed User Skills ({len(skills)}):"]
|
|
165
|
-
for skill in skills:
|
|
166
|
-
lines.append(f" - {skill.name}: {skill.description}")
|
|
167
|
-
return "\n".join(lines)
|
|
168
|
-
|
|
169
|
-
elif action == "uninstall":
|
|
170
|
-
if not name:
|
|
171
|
-
return "Error: 'name' is required for uninstall action"
|
|
172
|
-
result = uninstall_skill(name)
|
|
173
|
-
if result["success"]:
|
|
174
|
-
return f"Successfully uninstalled skill: {name}"
|
|
175
|
-
else:
|
|
176
|
-
return f"Failed to uninstall skill: {result['error']}"
|
|
177
|
-
|
|
178
|
-
else:
|
|
179
|
-
return f"Unknown action: {action}. Use 'install', 'list', or 'uninstall'."
|
|
180
|
-
|
|
181
|
-
|
|
182
109
|
@tool(parse_docstring=True)
|
|
183
110
|
def think_tool(reflection: str) -> str:
|
|
184
111
|
"""Tool for strategic reflection on research progress and decision-making.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: EvoScientist
|
|
3
|
+
Version: 0.1.0rc1
|
|
4
|
+
Summary: EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery
|
|
5
|
+
Author: Xi Zhang
|
|
6
|
+
Maintainer: Xi Zhang
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/EvoScientist/EvoScientist
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/EvoScientist/EvoScientist/issues
|
|
10
|
+
Project-URL: Documentation, https://github.com/EvoScientist/EvoScientist#readme
|
|
11
|
+
Keywords: ai-scientific,scientific-discovery,self-evolving,ai-scientists,end-to-end
|
|
12
|
+
Classifier: Programming Language :: Python :: 3
|
|
13
|
+
Requires-Python: >=3.11
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE
|
|
16
|
+
Requires-Dist: deepagents>=0.3.6
|
|
17
|
+
Requires-Dist: langchain>=1.2
|
|
18
|
+
Requires-Dist: langchain-anthropic>=1.3
|
|
19
|
+
Requires-Dist: anthropic>=0.76
|
|
20
|
+
Requires-Dist: tavily-python>=0.7
|
|
21
|
+
Requires-Dist: pyyaml>=6.0
|
|
22
|
+
Requires-Dist: rich>=14.0
|
|
23
|
+
Requires-Dist: prompt-toolkit>=3.0
|
|
24
|
+
Requires-Dist: python-dotenv>=1.0
|
|
25
|
+
Requires-Dist: langgraph-cli[inmem]>=0.4
|
|
26
|
+
Requires-Dist: httpx>=0.27
|
|
27
|
+
Requires-Dist: markdownify>=0.14
|
|
28
|
+
Provides-Extra: dev
|
|
29
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
30
|
+
Requires-Dist: pytest-cov>=5.0; extra == "dev"
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
<!-- Add logo here -->
|
|
34
|
+
<h1 align="center">
|
|
35
|
+
<!-- <img src="./assets/CCD_icon_logo.png" alt="CCD Logo" height="27" style="position: relative; top: -2px;"/> -->
|
|
36
|
+
<strong>EvoScientist</strong>
|
|
37
|
+
</h1>
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
<div align="center">
|
|
41
|
+
|
|
42
|
+
<a href="https://git.io/typing-svg"><img src="https://readme-typing-svg.demolab.com?font=Fira+Code&pause=1000&width=435&lines=Towards+Self-Evolving+AI+Scientists+for+End-to-End+Scientific+Discovery" alt="Typing SVG" /></a>
|
|
43
|
+
|
|
44
|
+
[]()
|
|
45
|
+
[]()
|
|
46
|
+
[]()
|
|
47
|
+
[]()
|
|
48
|
+
[]()
|
|
49
|
+
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
## 🔥 News
|
|
53
|
+
> TODO
|
|
54
|
+
- **[27 Sep 2025]** ⛳ Our preprint is now live on [arXiv] — check it out for details.
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
## Overview
|
|
58
|
+
> TODO
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## 📖 Contents
|
|
62
|
+
- [⛏️ Installation](#️-installation)
|
|
63
|
+
- [⚡ Quick Start](#-quick-start)
|
|
64
|
+
- [CLI Inference](#cli-inference)
|
|
65
|
+
- [Script Inference](#script-inference)
|
|
66
|
+
- [Web Interface](#web-interface)
|
|
67
|
+
- [📊 Evaluation](#-evaluation)
|
|
68
|
+
- [📝 Citation](#-citation)
|
|
69
|
+
- [📚 Acknowledgments](#-acknowledgments)
|
|
70
|
+
- [📦 Codebase Contributors](#-codebase-contributors)
|
|
71
|
+
- [📜 License](#-license)
|
|
72
|
+
|
|
73
|
+
## ⛏️ Installation
|
|
74
|
+
|
|
75
|
+
> [!TIP]
|
|
76
|
+
> Use [`uv`](https://pypi.org/project/uv) for installation — it's faster and more reliable than `pip`.
|
|
77
|
+
### For Development
|
|
78
|
+
|
|
79
|
+
```Shell
|
|
80
|
+
# Create and activate a conda environment
|
|
81
|
+
conda create -n EvoSci python=3.11 -y
|
|
82
|
+
conda activate EvoSci
|
|
83
|
+
|
|
84
|
+
# Install in development (editable) mode
|
|
85
|
+
pip install EvoScientist
|
|
86
|
+
# or
|
|
87
|
+
pip install -e .
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Option 1:
|
|
91
|
+
Install the latest version directly from GitHub for quick setup:
|
|
92
|
+
> TODO
|
|
93
|
+
### Option 2:
|
|
94
|
+
If you plan to modify the code or contribute to the project, you can clone the repository and install it in editable mode:
|
|
95
|
+
|
|
96
|
+
> TODO
|
|
97
|
+
|
|
98
|
+
<details>
|
|
99
|
+
<summary> 🔄 Upgrade to the latest code base </summary>
|
|
100
|
+
|
|
101
|
+
```Shell
|
|
102
|
+
git pull
|
|
103
|
+
uv pip install -e .
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
</details>
|
|
107
|
+
|
|
108
|
+
## ⚡ Quick Start
|
|
109
|
+
|
|
110
|
+
### CLI Inference
|
|
111
|
+
You can perform inference directly from the command line using our CLI tool:
|
|
112
|
+
|
|
113
|
+

|
|
114
|
+
|
|
115
|
+
```Shell
|
|
116
|
+
python -m EvoScientist
|
|
117
|
+
```
|
|
118
|
+
**Optional arguments:**
|
|
119
|
+
|
|
120
|
+
> TODO
|
|
121
|
+
|
|
122
|
+
### Script Inference
|
|
123
|
+
```python
|
|
124
|
+
from EvoScientist import agent
|
|
125
|
+
from langchain_core.messages import HumanMessage
|
|
126
|
+
from EvoScientist.utils import format_messages
|
|
127
|
+
thread = {"configurable": {"thread_id": "1"}}
|
|
128
|
+
question = "Hi?"
|
|
129
|
+
last_len = 0
|
|
130
|
+
|
|
131
|
+
for state in agent.stream(
|
|
132
|
+
{"messages": [HumanMessage(content=question)]},
|
|
133
|
+
config=thread,
|
|
134
|
+
stream_mode="values",
|
|
135
|
+
):
|
|
136
|
+
msgs = state["messages"]
|
|
137
|
+
if len(msgs) > last_len:
|
|
138
|
+
format_messages(msgs[last_len:])
|
|
139
|
+
last_len = len(msgs)
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
### Web Interface
|
|
144
|
+
|
|
145
|
+
> TODO
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
## 📊 Evaluation
|
|
149
|
+
|
|
150
|
+
> TODO
|
|
151
|
+
|
|
152
|
+
## 📝 Citation
|
|
153
|
+
|
|
154
|
+
If you find our paper and code useful in your research and applications, please cite using this BibTeX:
|
|
155
|
+
|
|
156
|
+
> TODO
|
|
157
|
+
|
|
158
|
+
## 📚 Acknowledgments
|
|
159
|
+
|
|
160
|
+
This project builds upon the following outstanding open-source works:
|
|
161
|
+
|
|
162
|
+
- [**Deep Agents**](https://github.com/langchain-ai/deepagents) — A framework for building AI agents that can interact with various tools and environments.
|
|
163
|
+
- [**Deep Agents UI**](https://github.com/langchain-ai/deep-agents-ui) — A user interface for visualising and managing Deep Agents.
|
|
164
|
+
|
|
165
|
+
We thank the authors for their valuable contributions to the open-source community.
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
## 📦 Codebase Contributors
|
|
169
|
+
|
|
170
|
+
<table>
|
|
171
|
+
<tbody>
|
|
172
|
+
<tr>
|
|
173
|
+
<td align="center">
|
|
174
|
+
<a href="https://youganglyu.github.io/">
|
|
175
|
+
<img src="https://youganglyu.github.io/images/profile.png"
|
|
176
|
+
width="100" height="100"
|
|
177
|
+
style="object-fit: cover; border-radius: 20%;" alt="Yougang Lyu"/>
|
|
178
|
+
<br />
|
|
179
|
+
<sub><b>Yougang Lyu</b></sub>
|
|
180
|
+
</a>
|
|
181
|
+
</td>
|
|
182
|
+
<td align="center">
|
|
183
|
+
<a href="https://x-izhang.github.io/">
|
|
184
|
+
<img src="https://x-izhang.github.io/author/xi-zhang/avatar_hu13660783057866068725.jpg"
|
|
185
|
+
width="100" height="100"
|
|
186
|
+
style="object-fit: cover; border-radius: 20%;" alt="Xi Zhang"/>
|
|
187
|
+
<br />
|
|
188
|
+
<sub><b>Xi Zhang</b></sub>
|
|
189
|
+
</a>
|
|
190
|
+
</td>
|
|
191
|
+
</tr>
|
|
192
|
+
</tbody>
|
|
193
|
+
</table>
|
|
194
|
+
|
|
195
|
+
For any enquiries or collaboration opportunities, please contact: [**youganglyu@gmail.com**](mailto:youganglyu@gmail.com)
|
|
196
|
+
|
|
197
|
+
## 📜 License
|
|
198
|
+
|
|
199
|
+
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
EvoScientist/EvoScientist.py,sha256=9q0iSru5zrwXMvK1sUtExGF4YAkIq2HZiJINuMRBz7o,4601
|
|
2
|
+
EvoScientist/__init__.py,sha256=yj4YJUPldtq4xx8geadIoZ1n-BmgsM2Z_S2W8ld9S1k,702
|
|
3
|
+
EvoScientist/__main__.py,sha256=P5USQ_BiiY0TBhtajGMuX5AMXlQ5joz1kvljHeacqmA,91
|
|
4
|
+
EvoScientist/backends.py,sha256=yKI5fofVd3sDxJp5BEaqPsXjIOrKrpge1KnFG-X7gzU,12321
|
|
5
|
+
EvoScientist/cli.py,sha256=TsLj8Dgkr0gRgVSpnazx1qRvF4X-yw6qRSqqK7c94VE,49399
|
|
6
|
+
EvoScientist/middleware.py,sha256=3ibUbv0jFyzRNcKBy7V2oZqIHQu-NSPWt1C3EHgj0lY,836
|
|
7
|
+
EvoScientist/prompts.py,sha256=ni-qHoEoM703xtfD4J3IlvwAWPcW8gcNiCBVjRJoy3g,10692
|
|
8
|
+
EvoScientist/subagent.yaml,sha256=yoFlMJWitLlYuOe4_44EPG6vjpNP_txHBlqr-kNX2GM,6130
|
|
9
|
+
EvoScientist/tools.py,sha256=oYaJN8tl_NCw6PLFFNRZbjPB9-VriVcpVb6Zp-d_xVQ,4223
|
|
10
|
+
EvoScientist/utils.py,sha256=GuWMRMkPHYgUOtoPZA0ErIt4FUBE4NMkz_OZluxYyRo,6801
|
|
11
|
+
EvoScientist/stream/__init__.py,sha256=cO30Ujs7mVB1pZjI0AXgaggmPeV6jXgBjt6AKYH42kQ,1219
|
|
12
|
+
EvoScientist/stream/emitter.py,sha256=zmdn8vIXNgkgoWRtanrMtPN2GlsHmZtdFmoqCry3o_o,2978
|
|
13
|
+
EvoScientist/stream/formatter.py,sha256=vyv89NGoTzxjsWt0teBXX38MZzFLhzMDBUcIH6-slDo,5532
|
|
14
|
+
EvoScientist/stream/tracker.py,sha256=cVWmiTCiwzOh84I7sAXXfgr_HXxOCCCzTvli-XJhthQ,3670
|
|
15
|
+
EvoScientist/stream/utils.py,sha256=36e5aaEZVpwTZnqO1qlVs2QTr04JbmWuvHMSbor49xM,7278
|
|
16
|
+
evoscientist-0.1.0rc1.dist-info/licenses/LICENSE,sha256=NsYFy5JSm90lmXcPNQuthVTCVaVcbT4XZ9h5HpAoGIo,1069
|
|
17
|
+
evoscientist-0.1.0rc1.dist-info/METADATA,sha256=FHHeFCQVotPc5FG1Z-cmz1blHtf_gyFGxyxrG5rclCg,5936
|
|
18
|
+
evoscientist-0.1.0rc1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
19
|
+
evoscientist-0.1.0rc1.dist-info/entry_points.txt,sha256=AQTfRSD-9-fgD1ViOdbGcvhsNeaUNgvmNqLkNY7o7Zw,55
|
|
20
|
+
evoscientist-0.1.0rc1.dist-info/top_level.txt,sha256=XBZouSd9lQfNn0Fus6jQb9nqdXzAbKyzh987Jt3A2-A,13
|
|
21
|
+
evoscientist-0.1.0rc1.dist-info/RECORD,,
|