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.
Files changed (113) hide show
  1. EvoScientist/EvoScientist.py +26 -62
  2. EvoScientist/__init__.py +0 -19
  3. EvoScientist/backends.py +0 -26
  4. EvoScientist/cli.py +1111 -498
  5. EvoScientist/middleware.py +8 -61
  6. EvoScientist/stream/__init__.py +0 -25
  7. EvoScientist/stream/utils.py +16 -23
  8. EvoScientist/tools.py +2 -75
  9. evoscientist-0.1.0rc1.dist-info/METADATA +199 -0
  10. evoscientist-0.1.0rc1.dist-info/RECORD +21 -0
  11. evoscientist-0.1.0rc1.dist-info/entry_points.txt +2 -0
  12. EvoScientist/config.py +0 -274
  13. EvoScientist/llm/__init__.py +0 -21
  14. EvoScientist/llm/models.py +0 -99
  15. EvoScientist/memory.py +0 -715
  16. EvoScientist/onboard.py +0 -725
  17. EvoScientist/paths.py +0 -44
  18. EvoScientist/skills/accelerate/SKILL.md +0 -332
  19. EvoScientist/skills/accelerate/references/custom-plugins.md +0 -453
  20. EvoScientist/skills/accelerate/references/megatron-integration.md +0 -489
  21. EvoScientist/skills/accelerate/references/performance.md +0 -525
  22. EvoScientist/skills/bitsandbytes/SKILL.md +0 -411
  23. EvoScientist/skills/bitsandbytes/references/memory-optimization.md +0 -521
  24. EvoScientist/skills/bitsandbytes/references/qlora-training.md +0 -521
  25. EvoScientist/skills/bitsandbytes/references/quantization-formats.md +0 -447
  26. EvoScientist/skills/find-skills/SKILL.md +0 -133
  27. EvoScientist/skills/find-skills/scripts/install_skill.py +0 -211
  28. EvoScientist/skills/flash-attention/SKILL.md +0 -367
  29. EvoScientist/skills/flash-attention/references/benchmarks.md +0 -215
  30. EvoScientist/skills/flash-attention/references/transformers-integration.md +0 -293
  31. EvoScientist/skills/llama-cpp/SKILL.md +0 -258
  32. EvoScientist/skills/llama-cpp/references/optimization.md +0 -89
  33. EvoScientist/skills/llama-cpp/references/quantization.md +0 -213
  34. EvoScientist/skills/llama-cpp/references/server.md +0 -125
  35. EvoScientist/skills/lm-evaluation-harness/SKILL.md +0 -490
  36. EvoScientist/skills/lm-evaluation-harness/references/api-evaluation.md +0 -490
  37. EvoScientist/skills/lm-evaluation-harness/references/benchmark-guide.md +0 -488
  38. EvoScientist/skills/lm-evaluation-harness/references/custom-tasks.md +0 -602
  39. EvoScientist/skills/lm-evaluation-harness/references/distributed-eval.md +0 -519
  40. EvoScientist/skills/ml-paper-writing/SKILL.md +0 -937
  41. EvoScientist/skills/ml-paper-writing/references/checklists.md +0 -361
  42. EvoScientist/skills/ml-paper-writing/references/citation-workflow.md +0 -562
  43. EvoScientist/skills/ml-paper-writing/references/reviewer-guidelines.md +0 -367
  44. EvoScientist/skills/ml-paper-writing/references/sources.md +0 -159
  45. EvoScientist/skills/ml-paper-writing/references/writing-guide.md +0 -476
  46. EvoScientist/skills/ml-paper-writing/templates/README.md +0 -251
  47. EvoScientist/skills/ml-paper-writing/templates/aaai2026/README.md +0 -534
  48. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +0 -144
  49. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +0 -952
  50. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +0 -111
  51. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +0 -1493
  52. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +0 -315
  53. EvoScientist/skills/ml-paper-writing/templates/acl/README.md +0 -50
  54. EvoScientist/skills/ml-paper-writing/templates/acl/acl.sty +0 -312
  55. EvoScientist/skills/ml-paper-writing/templates/acl/acl_latex.tex +0 -377
  56. EvoScientist/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +0 -101
  57. EvoScientist/skills/ml-paper-writing/templates/acl/acl_natbib.bst +0 -1940
  58. EvoScientist/skills/ml-paper-writing/templates/acl/anthology.bib.txt +0 -26
  59. EvoScientist/skills/ml-paper-writing/templates/acl/custom.bib +0 -70
  60. EvoScientist/skills/ml-paper-writing/templates/acl/formatting.md +0 -326
  61. EvoScientist/skills/ml-paper-writing/templates/colm2025/README.md +0 -3
  62. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +0 -11
  63. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +0 -1440
  64. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  65. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +0 -218
  66. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +0 -305
  67. EvoScientist/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +0 -485
  68. EvoScientist/skills/ml-paper-writing/templates/colm2025/math_commands.tex +0 -508
  69. EvoScientist/skills/ml-paper-writing/templates/colm2025/natbib.sty +0 -1246
  70. EvoScientist/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +0 -485
  71. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +0 -24
  72. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +0 -1440
  73. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  74. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +0 -246
  75. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +0 -414
  76. EvoScientist/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +0 -508
  77. EvoScientist/skills/ml-paper-writing/templates/iclr2026/natbib.sty +0 -1246
  78. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithm.sty +0 -79
  79. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +0 -201
  80. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.bib +0 -75
  81. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  82. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.tex +0 -662
  83. EvoScientist/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +0 -864
  84. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.bst +0 -1443
  85. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.sty +0 -767
  86. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  87. EvoScientist/skills/ml-paper-writing/templates/neurips2025/Makefile +0 -36
  88. EvoScientist/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +0 -53
  89. EvoScientist/skills/ml-paper-writing/templates/neurips2025/main.tex +0 -38
  90. EvoScientist/skills/ml-paper-writing/templates/neurips2025/neurips.sty +0 -382
  91. EvoScientist/skills/peft/SKILL.md +0 -431
  92. EvoScientist/skills/peft/references/advanced-usage.md +0 -514
  93. EvoScientist/skills/peft/references/troubleshooting.md +0 -480
  94. EvoScientist/skills/ray-data/SKILL.md +0 -326
  95. EvoScientist/skills/ray-data/references/integration.md +0 -82
  96. EvoScientist/skills/ray-data/references/transformations.md +0 -83
  97. EvoScientist/skills/skill-creator/LICENSE.txt +0 -202
  98. EvoScientist/skills/skill-creator/SKILL.md +0 -356
  99. EvoScientist/skills/skill-creator/references/output-patterns.md +0 -82
  100. EvoScientist/skills/skill-creator/references/workflows.md +0 -28
  101. EvoScientist/skills/skill-creator/scripts/init_skill.py +0 -303
  102. EvoScientist/skills/skill-creator/scripts/package_skill.py +0 -110
  103. EvoScientist/skills/skill-creator/scripts/quick_validate.py +0 -95
  104. EvoScientist/skills_manager.py +0 -391
  105. EvoScientist/stream/display.py +0 -604
  106. EvoScientist/stream/events.py +0 -415
  107. EvoScientist/stream/state.py +0 -343
  108. evoscientist-0.0.1.dev4.dist-info/METADATA +0 -367
  109. evoscientist-0.0.1.dev4.dist-info/RECORD +0 -117
  110. evoscientist-0.0.1.dev4.dist-info/entry_points.txt +0 -5
  111. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc1.dist-info}/WHEEL +0 -0
  112. {evoscientist-0.0.1.dev4.dist-info → evoscientist-0.1.0rc1.dist-info}/licenses/LICENSE +0 -0
  113. {evoscientist-0.0.1.dev4.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
@@ -16,16 +16,7 @@ from typing_extensions import Annotated
16
16
 
17
17
  load_dotenv(override=True)
18
18
 
19
- # Lazy initialization - only create client when needed
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 _get_tavily_client().search(
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
+ [![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