EvoScientist 0.0.1.dev3__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.
Files changed (108) hide show
  1. EvoScientist/EvoScientist.py +17 -49
  2. EvoScientist/backends.py +0 -26
  3. EvoScientist/cli.py +1109 -255
  4. EvoScientist/middleware.py +8 -61
  5. EvoScientist/stream/__init__.py +0 -25
  6. EvoScientist/stream/utils.py +16 -23
  7. EvoScientist/tools.py +0 -64
  8. evoscientist-0.1.0rc1.dist-info/METADATA +199 -0
  9. evoscientist-0.1.0rc1.dist-info/RECORD +21 -0
  10. evoscientist-0.1.0rc1.dist-info/entry_points.txt +2 -0
  11. EvoScientist/memory.py +0 -715
  12. EvoScientist/paths.py +0 -45
  13. EvoScientist/skills/accelerate/SKILL.md +0 -332
  14. EvoScientist/skills/accelerate/references/custom-plugins.md +0 -453
  15. EvoScientist/skills/accelerate/references/megatron-integration.md +0 -489
  16. EvoScientist/skills/accelerate/references/performance.md +0 -525
  17. EvoScientist/skills/bitsandbytes/SKILL.md +0 -411
  18. EvoScientist/skills/bitsandbytes/references/memory-optimization.md +0 -521
  19. EvoScientist/skills/bitsandbytes/references/qlora-training.md +0 -521
  20. EvoScientist/skills/bitsandbytes/references/quantization-formats.md +0 -447
  21. EvoScientist/skills/find-skills/SKILL.md +0 -133
  22. EvoScientist/skills/find-skills/scripts/install_skill.py +0 -211
  23. EvoScientist/skills/flash-attention/SKILL.md +0 -367
  24. EvoScientist/skills/flash-attention/references/benchmarks.md +0 -215
  25. EvoScientist/skills/flash-attention/references/transformers-integration.md +0 -293
  26. EvoScientist/skills/llama-cpp/SKILL.md +0 -258
  27. EvoScientist/skills/llama-cpp/references/optimization.md +0 -89
  28. EvoScientist/skills/llama-cpp/references/quantization.md +0 -213
  29. EvoScientist/skills/llama-cpp/references/server.md +0 -125
  30. EvoScientist/skills/lm-evaluation-harness/SKILL.md +0 -490
  31. EvoScientist/skills/lm-evaluation-harness/references/api-evaluation.md +0 -490
  32. EvoScientist/skills/lm-evaluation-harness/references/benchmark-guide.md +0 -488
  33. EvoScientist/skills/lm-evaluation-harness/references/custom-tasks.md +0 -602
  34. EvoScientist/skills/lm-evaluation-harness/references/distributed-eval.md +0 -519
  35. EvoScientist/skills/ml-paper-writing/SKILL.md +0 -937
  36. EvoScientist/skills/ml-paper-writing/references/checklists.md +0 -361
  37. EvoScientist/skills/ml-paper-writing/references/citation-workflow.md +0 -562
  38. EvoScientist/skills/ml-paper-writing/references/reviewer-guidelines.md +0 -367
  39. EvoScientist/skills/ml-paper-writing/references/sources.md +0 -159
  40. EvoScientist/skills/ml-paper-writing/references/writing-guide.md +0 -476
  41. EvoScientist/skills/ml-paper-writing/templates/README.md +0 -251
  42. EvoScientist/skills/ml-paper-writing/templates/aaai2026/README.md +0 -534
  43. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +0 -144
  44. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +0 -952
  45. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +0 -111
  46. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +0 -1493
  47. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +0 -315
  48. EvoScientist/skills/ml-paper-writing/templates/acl/README.md +0 -50
  49. EvoScientist/skills/ml-paper-writing/templates/acl/acl.sty +0 -312
  50. EvoScientist/skills/ml-paper-writing/templates/acl/acl_latex.tex +0 -377
  51. EvoScientist/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +0 -101
  52. EvoScientist/skills/ml-paper-writing/templates/acl/acl_natbib.bst +0 -1940
  53. EvoScientist/skills/ml-paper-writing/templates/acl/anthology.bib.txt +0 -26
  54. EvoScientist/skills/ml-paper-writing/templates/acl/custom.bib +0 -70
  55. EvoScientist/skills/ml-paper-writing/templates/acl/formatting.md +0 -326
  56. EvoScientist/skills/ml-paper-writing/templates/colm2025/README.md +0 -3
  57. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +0 -11
  58. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +0 -1440
  59. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  60. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +0 -218
  61. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +0 -305
  62. EvoScientist/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +0 -485
  63. EvoScientist/skills/ml-paper-writing/templates/colm2025/math_commands.tex +0 -508
  64. EvoScientist/skills/ml-paper-writing/templates/colm2025/natbib.sty +0 -1246
  65. EvoScientist/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +0 -485
  66. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +0 -24
  67. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +0 -1440
  68. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  69. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +0 -246
  70. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +0 -414
  71. EvoScientist/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +0 -508
  72. EvoScientist/skills/ml-paper-writing/templates/iclr2026/natbib.sty +0 -1246
  73. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithm.sty +0 -79
  74. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +0 -201
  75. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.bib +0 -75
  76. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  77. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.tex +0 -662
  78. EvoScientist/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +0 -864
  79. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.bst +0 -1443
  80. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.sty +0 -767
  81. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  82. EvoScientist/skills/ml-paper-writing/templates/neurips2025/Makefile +0 -36
  83. EvoScientist/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +0 -53
  84. EvoScientist/skills/ml-paper-writing/templates/neurips2025/main.tex +0 -38
  85. EvoScientist/skills/ml-paper-writing/templates/neurips2025/neurips.sty +0 -382
  86. EvoScientist/skills/peft/SKILL.md +0 -431
  87. EvoScientist/skills/peft/references/advanced-usage.md +0 -514
  88. EvoScientist/skills/peft/references/troubleshooting.md +0 -480
  89. EvoScientist/skills/ray-data/SKILL.md +0 -326
  90. EvoScientist/skills/ray-data/references/integration.md +0 -82
  91. EvoScientist/skills/ray-data/references/transformations.md +0 -83
  92. EvoScientist/skills/skill-creator/LICENSE.txt +0 -202
  93. EvoScientist/skills/skill-creator/SKILL.md +0 -356
  94. EvoScientist/skills/skill-creator/references/output-patterns.md +0 -82
  95. EvoScientist/skills/skill-creator/references/workflows.md +0 -28
  96. EvoScientist/skills/skill-creator/scripts/init_skill.py +0 -303
  97. EvoScientist/skills/skill-creator/scripts/package_skill.py +0 -110
  98. EvoScientist/skills/skill-creator/scripts/quick_validate.py +0 -95
  99. EvoScientist/skills_manager.py +0 -392
  100. EvoScientist/stream/display.py +0 -604
  101. EvoScientist/stream/events.py +0 -415
  102. EvoScientist/stream/state.py +0 -343
  103. evoscientist-0.0.1.dev3.dist-info/METADATA +0 -321
  104. evoscientist-0.0.1.dev3.dist-info/RECORD +0 -113
  105. evoscientist-0.0.1.dev3.dist-info/entry_points.txt +0 -5
  106. {evoscientist-0.0.1.dev3.dist-info → evoscientist-0.1.0rc1.dist-info}/WHEEL +0 -0
  107. {evoscientist-0.0.1.dev3.dist-info → evoscientist-0.1.0rc1.dist-info}/licenses/LICENSE +0 -0
  108. {evoscientist-0.0.1.dev3.dist-info → evoscientist-0.1.0rc1.dist-info}/top_level.txt +0 -0
@@ -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 = _DEFAULT_SKILLS_DIR,
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
- Merges user-installed skills (./skills/) with system skills
29
- (package built-in). User skills take priority on name conflicts.
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 system skills directory (package built-in)
33
- workspace_dir: Path to the project root (user skills live under {workspace_dir}/skills/)
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
- if user_skills_dir is None:
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=merged,
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
- )
@@ -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
  ]
@@ -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] + "\u2026"
117
+ cmd = cmd[:47] + "..."
118
118
  return f"execute({cmd})"
119
119
 
120
- # File operations (with special case for memory files)
120
+ # File operations
121
121
  if name_lower == "read_file":
122
- path = args.get("path", "")
123
- if path.endswith("/MEMORY.md") or path == "/MEMORY.md":
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
- if path.endswith("/MEMORY.md") or path == "/MEMORY.md":
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
- if path.endswith("/MEMORY.md") or path == "/MEMORY.md":
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
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] + "\u2026"
208
+ params_str = params_str[:47] + "..."
216
209
 
217
210
  return f"{name}({params_str})"
218
211
 
EvoScientist/tools.py CHANGED
@@ -106,70 +106,6 @@ async def tavily_search(
106
106
  return f"Search failed: {str(e)}"
107
107
 
108
108
 
109
- @tool(parse_docstring=True)
110
- def skill_manager(
111
- action: Literal["install", "list", "uninstall"],
112
- source: str = "",
113
- name: str = "",
114
- ) -> str:
115
- """Manage user skills: install, list, or uninstall.
116
-
117
- Use this tool when the user asks to:
118
- - Install a skill (action="install", source required)
119
- - List installed skills (action="list")
120
- - Uninstall a skill (action="uninstall", name required)
121
-
122
- Supported sources for install:
123
- - Local path: "./my-skill" or "/path/to/skill"
124
- - GitHub URL: "https://github.com/owner/repo/tree/main/skill-name"
125
- - GitHub shorthand: "owner/repo@skill-name"
126
-
127
- Args:
128
- action: One of "install", "list", or "uninstall"
129
- source: For install - local path or GitHub URL/shorthand
130
- name: For uninstall - skill name to remove
131
-
132
- Returns:
133
- Result message
134
- """
135
- from .skills_manager import install_skill, list_skills, uninstall_skill
136
-
137
- if action == "install":
138
- if not source:
139
- return "Error: 'source' is required for install action"
140
- result = install_skill(source)
141
- if result["success"]:
142
- return (
143
- f"Successfully installed skill: {result['name']}\n"
144
- f"Description: {result.get('description', '(none)')}\n"
145
- f"Path: {result['path']}\n\n"
146
- f"Use load_skill to activate it."
147
- )
148
- else:
149
- return f"Failed to install skill: {result['error']}"
150
-
151
- elif action == "list":
152
- skills = list_skills(include_system=False)
153
- if not skills:
154
- return "No user skills installed. Use action='install' to add skills."
155
- lines = [f"Installed User Skills ({len(skills)}):"]
156
- for skill in skills:
157
- lines.append(f" - {skill.name}: {skill.description}")
158
- return "\n".join(lines)
159
-
160
- elif action == "uninstall":
161
- if not name:
162
- return "Error: 'name' is required for uninstall action"
163
- result = uninstall_skill(name)
164
- if result["success"]:
165
- return f"Successfully uninstalled skill: {name}"
166
- else:
167
- return f"Failed to uninstall skill: {result['error']}"
168
-
169
- else:
170
- return f"Unknown action: {action}. Use 'install', 'list', or 'uninstall'."
171
-
172
-
173
109
  @tool(parse_docstring=True)
174
110
  def think_tool(reflection: str) -> str:
175
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
+ [![Project Page](https://img.shields.io/badge/Project-Page-4285F4?style=for-the-badge&logo=googlelens&logoColor=4285F4)]()
45
+ [![arXiv](https://img.shields.io/badge/arXiv-xxxx.xxxx-b31b1b?style=for-the-badge&logo=arxiv&logoColor=b31b1b)]()
46
+ [![Gradio Demo](https://img.shields.io/badge/Gradio-Online_Demo-FFCC00?style=for-the-badge&logo=gradio&logoColor=yellow&labelColor=grey)]()
47
+ [![Evaluation Split](https://img.shields.io/badge/HF-Test_Dataset-AECBFA?style=for-the-badge&logo=huggingface&logoColor=FFCC00&labelColor=grey)]()
48
+ [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)]()
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
+ ![demo](./assets/EvoScientist_cli.png)
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,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ evoscientist = EvoScientist.cli:main