EvoScientist 0.0.1.dev2__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 (107) hide show
  1. EvoScientist/EvoScientist.py +157 -0
  2. EvoScientist/__init__.py +24 -0
  3. EvoScientist/__main__.py +4 -0
  4. EvoScientist/backends.py +392 -0
  5. EvoScientist/cli.py +1553 -0
  6. EvoScientist/middleware.py +35 -0
  7. EvoScientist/prompts.py +277 -0
  8. EvoScientist/skills/accelerate/SKILL.md +332 -0
  9. EvoScientist/skills/accelerate/references/custom-plugins.md +453 -0
  10. EvoScientist/skills/accelerate/references/megatron-integration.md +489 -0
  11. EvoScientist/skills/accelerate/references/performance.md +525 -0
  12. EvoScientist/skills/bitsandbytes/SKILL.md +411 -0
  13. EvoScientist/skills/bitsandbytes/references/memory-optimization.md +521 -0
  14. EvoScientist/skills/bitsandbytes/references/qlora-training.md +521 -0
  15. EvoScientist/skills/bitsandbytes/references/quantization-formats.md +447 -0
  16. EvoScientist/skills/find-skills/SKILL.md +133 -0
  17. EvoScientist/skills/find-skills/scripts/install_skill.py +211 -0
  18. EvoScientist/skills/flash-attention/SKILL.md +367 -0
  19. EvoScientist/skills/flash-attention/references/benchmarks.md +215 -0
  20. EvoScientist/skills/flash-attention/references/transformers-integration.md +293 -0
  21. EvoScientist/skills/llama-cpp/SKILL.md +258 -0
  22. EvoScientist/skills/llama-cpp/references/optimization.md +89 -0
  23. EvoScientist/skills/llama-cpp/references/quantization.md +213 -0
  24. EvoScientist/skills/llama-cpp/references/server.md +125 -0
  25. EvoScientist/skills/lm-evaluation-harness/SKILL.md +490 -0
  26. EvoScientist/skills/lm-evaluation-harness/references/api-evaluation.md +490 -0
  27. EvoScientist/skills/lm-evaluation-harness/references/benchmark-guide.md +488 -0
  28. EvoScientist/skills/lm-evaluation-harness/references/custom-tasks.md +602 -0
  29. EvoScientist/skills/lm-evaluation-harness/references/distributed-eval.md +519 -0
  30. EvoScientist/skills/ml-paper-writing/SKILL.md +937 -0
  31. EvoScientist/skills/ml-paper-writing/references/checklists.md +361 -0
  32. EvoScientist/skills/ml-paper-writing/references/citation-workflow.md +562 -0
  33. EvoScientist/skills/ml-paper-writing/references/reviewer-guidelines.md +367 -0
  34. EvoScientist/skills/ml-paper-writing/references/sources.md +159 -0
  35. EvoScientist/skills/ml-paper-writing/references/writing-guide.md +476 -0
  36. EvoScientist/skills/ml-paper-writing/templates/README.md +251 -0
  37. EvoScientist/skills/ml-paper-writing/templates/aaai2026/README.md +534 -0
  38. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-supp.tex +144 -0
  39. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026-unified-template.tex +952 -0
  40. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bib +111 -0
  41. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.bst +1493 -0
  42. EvoScientist/skills/ml-paper-writing/templates/aaai2026/aaai2026.sty +315 -0
  43. EvoScientist/skills/ml-paper-writing/templates/acl/README.md +50 -0
  44. EvoScientist/skills/ml-paper-writing/templates/acl/acl.sty +312 -0
  45. EvoScientist/skills/ml-paper-writing/templates/acl/acl_latex.tex +377 -0
  46. EvoScientist/skills/ml-paper-writing/templates/acl/acl_lualatex.tex +101 -0
  47. EvoScientist/skills/ml-paper-writing/templates/acl/acl_natbib.bst +1940 -0
  48. EvoScientist/skills/ml-paper-writing/templates/acl/anthology.bib.txt +26 -0
  49. EvoScientist/skills/ml-paper-writing/templates/acl/custom.bib +70 -0
  50. EvoScientist/skills/ml-paper-writing/templates/acl/formatting.md +326 -0
  51. EvoScientist/skills/ml-paper-writing/templates/colm2025/README.md +3 -0
  52. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bib +11 -0
  53. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.bst +1440 -0
  54. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.pdf +0 -0
  55. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.sty +218 -0
  56. EvoScientist/skills/ml-paper-writing/templates/colm2025/colm2025_conference.tex +305 -0
  57. EvoScientist/skills/ml-paper-writing/templates/colm2025/fancyhdr.sty +485 -0
  58. EvoScientist/skills/ml-paper-writing/templates/colm2025/math_commands.tex +508 -0
  59. EvoScientist/skills/ml-paper-writing/templates/colm2025/natbib.sty +1246 -0
  60. EvoScientist/skills/ml-paper-writing/templates/iclr2026/fancyhdr.sty +485 -0
  61. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bib +24 -0
  62. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.bst +1440 -0
  63. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.pdf +0 -0
  64. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.sty +246 -0
  65. EvoScientist/skills/ml-paper-writing/templates/iclr2026/iclr2026_conference.tex +414 -0
  66. EvoScientist/skills/ml-paper-writing/templates/iclr2026/math_commands.tex +508 -0
  67. EvoScientist/skills/ml-paper-writing/templates/iclr2026/natbib.sty +1246 -0
  68. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithm.sty +79 -0
  69. EvoScientist/skills/ml-paper-writing/templates/icml2026/algorithmic.sty +201 -0
  70. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.bib +75 -0
  71. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.pdf +0 -0
  72. EvoScientist/skills/ml-paper-writing/templates/icml2026/example_paper.tex +662 -0
  73. EvoScientist/skills/ml-paper-writing/templates/icml2026/fancyhdr.sty +864 -0
  74. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.bst +1443 -0
  75. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml2026.sty +767 -0
  76. EvoScientist/skills/ml-paper-writing/templates/icml2026/icml_numpapers.pdf +0 -0
  77. EvoScientist/skills/ml-paper-writing/templates/neurips2025/Makefile +36 -0
  78. EvoScientist/skills/ml-paper-writing/templates/neurips2025/extra_pkgs.tex +53 -0
  79. EvoScientist/skills/ml-paper-writing/templates/neurips2025/main.tex +38 -0
  80. EvoScientist/skills/ml-paper-writing/templates/neurips2025/neurips.sty +382 -0
  81. EvoScientist/skills/peft/SKILL.md +431 -0
  82. EvoScientist/skills/peft/references/advanced-usage.md +514 -0
  83. EvoScientist/skills/peft/references/troubleshooting.md +480 -0
  84. EvoScientist/skills/ray-data/SKILL.md +326 -0
  85. EvoScientist/skills/ray-data/references/integration.md +82 -0
  86. EvoScientist/skills/ray-data/references/transformations.md +83 -0
  87. EvoScientist/skills/skill-creator/LICENSE.txt +202 -0
  88. EvoScientist/skills/skill-creator/SKILL.md +356 -0
  89. EvoScientist/skills/skill-creator/references/output-patterns.md +82 -0
  90. EvoScientist/skills/skill-creator/references/workflows.md +28 -0
  91. EvoScientist/skills/skill-creator/scripts/init_skill.py +303 -0
  92. EvoScientist/skills/skill-creator/scripts/package_skill.py +110 -0
  93. EvoScientist/skills/skill-creator/scripts/quick_validate.py +95 -0
  94. EvoScientist/stream/__init__.py +53 -0
  95. EvoScientist/stream/emitter.py +94 -0
  96. EvoScientist/stream/formatter.py +168 -0
  97. EvoScientist/stream/tracker.py +115 -0
  98. EvoScientist/stream/utils.py +255 -0
  99. EvoScientist/subagent.yaml +147 -0
  100. EvoScientist/tools.py +135 -0
  101. EvoScientist/utils.py +207 -0
  102. evoscientist-0.0.1.dev2.dist-info/METADATA +227 -0
  103. evoscientist-0.0.1.dev2.dist-info/RECORD +107 -0
  104. evoscientist-0.0.1.dev2.dist-info/WHEEL +5 -0
  105. evoscientist-0.0.1.dev2.dist-info/entry_points.txt +5 -0
  106. evoscientist-0.0.1.dev2.dist-info/licenses/LICENSE +21 -0
  107. evoscientist-0.0.1.dev2.dist-info/top_level.txt +1 -0
EvoScientist/tools.py ADDED
@@ -0,0 +1,135 @@
1
+ """Tools.
2
+
3
+ This module provides search and reflection tools for the research agent,
4
+ using Tavily for URL discovery and fetching full webpage content.
5
+ """
6
+
7
+ import asyncio
8
+ from typing import Literal
9
+
10
+ import httpx
11
+ from dotenv import load_dotenv
12
+ from langchain_core.tools import InjectedToolArg, tool
13
+ from markdownify import markdownify
14
+ from tavily import TavilyClient
15
+ from typing_extensions import Annotated
16
+
17
+ load_dotenv(override=True)
18
+
19
+ tavily_client = TavilyClient()
20
+
21
+
22
+ async def fetch_webpage_content(url: str, timeout: float = 10.0) -> str:
23
+ """Fetch and convert webpage content to markdown.
24
+
25
+ Args:
26
+ url: URL to fetch
27
+ timeout: Request timeout in seconds
28
+
29
+ Returns:
30
+ Webpage content as markdown
31
+ """
32
+ headers = {
33
+ "User-Agent": (
34
+ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
35
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
36
+ "Chrome/91.0.4472.124 Safari/537.36"
37
+ )
38
+ }
39
+
40
+ try:
41
+ async with httpx.AsyncClient() as client:
42
+ response = await client.get(url, headers=headers, timeout=timeout)
43
+ response.raise_for_status()
44
+ return markdownify(response.text)
45
+ except Exception as e:
46
+ return f"Error fetching content from {url}: {str(e)}"
47
+
48
+
49
+ @tool(parse_docstring=True)
50
+ async def tavily_search(
51
+ query: str,
52
+ max_results: Annotated[int, InjectedToolArg] = 3,
53
+ topic: Annotated[
54
+ Literal["general", "news", "finance"], InjectedToolArg
55
+ ] = "general",
56
+ ) -> str:
57
+ """Search the web for information on a given query.
58
+
59
+ Uses Tavily to discover relevant URLs, then fetches and returns
60
+ full webpage content as markdown for comprehensive research.
61
+
62
+ Args:
63
+ query: Search query to execute
64
+
65
+ Returns:
66
+ Formatted search results with full webpage content in markdown
67
+ """
68
+
69
+ def _sync_search() -> dict:
70
+ return tavily_client.search(
71
+ query,
72
+ max_results=max_results,
73
+ topic=topic,
74
+ )
75
+
76
+ try:
77
+ # Run Tavily search asynchronously
78
+ search_results = await asyncio.to_thread(_sync_search)
79
+
80
+ # Fetch full content for each URL concurrently
81
+ results = search_results.get("results", [])
82
+ if not results:
83
+ return f"No results found for '{query}'"
84
+
85
+ # Fetch all webpages concurrently
86
+ fetch_tasks = [fetch_webpage_content(r["url"]) for r in results]
87
+ contents = await asyncio.gather(*fetch_tasks)
88
+
89
+ # Format results
90
+ result_texts = []
91
+ for result, content in zip(results, contents):
92
+ result_text = f"""## {result["title"]}
93
+ **URL:** {result["url"]}
94
+
95
+ {content}
96
+
97
+ ---
98
+ """
99
+ result_texts.append(result_text)
100
+
101
+ return f"""Found {len(result_texts)} result(s) for '{query}':
102
+
103
+ {"".join(result_texts)}"""
104
+
105
+ except Exception as e:
106
+ return f"Search failed: {str(e)}"
107
+
108
+
109
+ @tool(parse_docstring=True)
110
+ def think_tool(reflection: str) -> str:
111
+ """Tool for strategic reflection on research progress and decision-making.
112
+
113
+ Use this tool after each search to analyze results and plan next steps systematically.
114
+ This creates a deliberate pause in the research workflow for quality decision-making.
115
+
116
+ When to use:
117
+ - After receiving search results: What key information did I find?
118
+ - Before deciding next steps: Do I have enough to answer comprehensively?
119
+ - When assessing research gaps: What specific information am I still missing?
120
+ - Before concluding research: Can I provide a complete answer now?
121
+
122
+ Reflection should address:
123
+ 1. Analysis of current findings - What concrete information have I gathered?
124
+ 2. Gap assessment - What crucial information is still missing?
125
+ 3. Quality evaluation - Do I have sufficient evidence/examples for a good answer?
126
+ 4. Strategic decision - Should I continue searching or provide my answer?
127
+ 5. Skill leverage - Is there a relevant local skill to load that can accelerate this work?
128
+
129
+ Args:
130
+ reflection: Your detailed reflection on research progress, findings, gaps, and next steps
131
+
132
+ Returns:
133
+ Confirmation that reflection was recorded for decision-making
134
+ """
135
+ return f"Reflection recorded: {reflection}"
EvoScientist/utils.py ADDED
@@ -0,0 +1,207 @@
1
+ """Utility functions for EvoScientist.
2
+
3
+ This module primarily contains helpers for displaying messages and prompts in
4
+ notebooks, and lightweight configuration loaders used by the agent runtime.
5
+ """
6
+
7
+ import json
8
+ from pathlib import Path
9
+ from typing import Any
10
+
11
+ import yaml
12
+ from rich.console import Console
13
+ from rich.panel import Panel
14
+ from rich.text import Text
15
+
16
+ console = Console()
17
+
18
+
19
+ def format_message_content(message):
20
+ """Convert message content to displayable string."""
21
+ parts = []
22
+ tool_calls_processed = False
23
+
24
+ # Handle main content
25
+ if isinstance(message.content, str):
26
+ parts.append(message.content)
27
+ elif isinstance(message.content, list):
28
+ # Handle complex content like tool calls (Anthropic format)
29
+ for item in message.content:
30
+ if item.get("type") == "text":
31
+ parts.append(item["text"])
32
+ elif item.get("type") == "tool_use":
33
+ parts.append(f"\n🔧 Tool Call: {item['name']}")
34
+ parts.append(f" Args: {json.dumps(item['input'], indent=2)}")
35
+ parts.append(f" ID: {item.get('id', 'N/A')}")
36
+ tool_calls_processed = True
37
+ else:
38
+ parts.append(str(message.content))
39
+
40
+ # Handle tool calls attached to the message (OpenAI format) - only if not already processed
41
+ if (
42
+ not tool_calls_processed
43
+ and hasattr(message, "tool_calls")
44
+ and message.tool_calls
45
+ ):
46
+ for tool_call in message.tool_calls:
47
+ parts.append(f"\n🔧 Tool Call: {tool_call['name']}")
48
+ parts.append(f" Args: {json.dumps(tool_call['args'], indent=2)}")
49
+ parts.append(f" ID: {tool_call['id']}")
50
+
51
+ return "\n".join(parts)
52
+
53
+
54
+ def format_messages(messages):
55
+ """Format and display a list of messages with Rich formatting."""
56
+ for m in messages:
57
+ msg_type = m.__class__.__name__.replace("Message", "")
58
+ content = format_message_content(m)
59
+
60
+ if msg_type == "Human":
61
+ console.print(Panel(content, title="🧑 Human", border_style="blue"))
62
+ elif msg_type == "Ai":
63
+ console.print(Panel(content, title="🤖 Assistant", border_style="green"))
64
+ elif msg_type == "Tool":
65
+ console.print(Panel(content, title="🔧 Tool Output", border_style="yellow"))
66
+ else:
67
+ console.print(Panel(content, title=f"📝 {msg_type}", border_style="white"))
68
+
69
+
70
+ def format_message(messages):
71
+ """Alias for format_messages for backward compatibility."""
72
+ return format_messages(messages)
73
+
74
+
75
+ def show_prompt(prompt_text: str, title: str = "Prompt", border_style: str = "blue"):
76
+ """Display a prompt with rich formatting and XML tag highlighting.
77
+
78
+ Args:
79
+ prompt_text: The prompt string to display
80
+ title: Title for the panel (default: "Prompt")
81
+ border_style: Border color style (default: "blue")
82
+ """
83
+ # Create a formatted display of the prompt
84
+ formatted_text = Text(prompt_text)
85
+ formatted_text.highlight_regex(r"<[^>]+>", style="bold blue") # Highlight XML tags
86
+ formatted_text.highlight_regex(
87
+ r"##[^#\n]+", style="bold magenta"
88
+ ) # Highlight headers
89
+ formatted_text.highlight_regex(
90
+ r"###[^#\n]+", style="bold cyan"
91
+ ) # Highlight sub-headers
92
+
93
+ # Display in a panel for better presentation
94
+ console.print(
95
+ Panel(
96
+ formatted_text,
97
+ title=f"[bold green]{title}[/bold green]",
98
+ border_style=border_style,
99
+ padding=(1, 2),
100
+ )
101
+ )
102
+
103
+
104
+ def load_subagents(
105
+ config_path: Path,
106
+ *,
107
+ tool_registry: dict[str, Any],
108
+ prompt_refs: dict[str, str] | None = None,
109
+ ) -> list[dict[str, Any]]:
110
+ """Load subagent definitions from YAML and wire up tools.
111
+
112
+ NOTE: This is a custom utility. deepagents does not natively load subagents
113
+ from files - they're normally defined inline in the create_deep_agent() call.
114
+ We externalize to YAML here to keep configuration separate from code.
115
+
116
+ Supported YAML schemas:
117
+
118
+ 1) Mapping style (recommended):
119
+ planner-agent:
120
+ description: "..."
121
+ tools: [think_tool]
122
+ system_prompt: |
123
+ ...
124
+ research-agent:
125
+ description: "..."
126
+ tools: [tavily_search, think_tool]
127
+ system_prompt_ref: RESEARCHER_INSTRUCTIONS
128
+
129
+ 2) List style (legacy):
130
+ subagents:
131
+ - name: planner-agent
132
+ description: "..."
133
+ tools: [think_tool]
134
+ system_prompt: |
135
+ ...
136
+ """
137
+ prompt_refs = prompt_refs or {}
138
+
139
+ with config_path.open(encoding="utf-8") as f:
140
+ config = yaml.safe_load(f) or {}
141
+
142
+ if not isinstance(config, dict) or not config:
143
+ raise ValueError("subagent.yaml must be a mapping or contain 'subagents:'")
144
+
145
+ subagents: list[dict[str, Any]] = []
146
+
147
+ def _build_one(name: str, spec: dict[str, Any]) -> dict[str, Any]:
148
+ subagent: dict[str, Any] = {
149
+ "name": name,
150
+ "description": spec.get("description", ""),
151
+ }
152
+
153
+ if "system_prompt_ref" in spec:
154
+ ref = spec["system_prompt_ref"]
155
+ if ref not in prompt_refs:
156
+ raise ValueError(f"Unknown system_prompt_ref '{ref}' for subagent '{name}'")
157
+ subagent["system_prompt"] = prompt_refs[ref]
158
+ else:
159
+ subagent["system_prompt"] = spec.get("system_prompt", "")
160
+
161
+ if "model" in spec:
162
+ subagent["model"] = spec["model"]
163
+
164
+ if "tools" in spec:
165
+ subagent["tools"] = [tool_registry[t] for t in spec["tools"]]
166
+
167
+ return subagent
168
+
169
+ # Legacy list style
170
+ if "subagents" in config:
171
+ items = config.get("subagents")
172
+ if not isinstance(items, list) or not items:
173
+ raise ValueError("subagent.yaml must contain a non-empty 'subagents:' list")
174
+ for item in items:
175
+ if not isinstance(item, dict):
176
+ continue
177
+ name = item.get("name")
178
+ if not name:
179
+ raise ValueError("Each subagent entry must have a 'name'")
180
+ subagents.append(_build_one(name, item))
181
+ return subagents
182
+
183
+ # Mapping style: {<name>: <spec>}
184
+ for name, spec in config.items():
185
+ if not isinstance(spec, dict):
186
+ continue
187
+ subagents.append(_build_one(name, spec))
188
+
189
+ return subagents
190
+
191
+
192
+ def load_subagent(
193
+ config_path: Path,
194
+ name: str,
195
+ *,
196
+ tool_registry: dict[str, Any],
197
+ prompt_refs: dict[str, str] | None = None,
198
+ ) -> dict[str, Any]:
199
+ """Load a single sub-agent by name from YAML."""
200
+ for agent in load_subagents(
201
+ config_path,
202
+ tool_registry=tool_registry,
203
+ prompt_refs=prompt_refs,
204
+ ):
205
+ if agent.get("name") == name:
206
+ return agent
207
+ raise KeyError(f"Sub-agent not found: {name}")
@@ -0,0 +1,227 @@
1
+ Metadata-Version: 2.4
2
+ Name: EvoScientist
3
+ Version: 0.0.1.dev2
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
+ [![PyPI](https://img.shields.io/badge/PyPI-EvoScientist%20v0.0.1-3da9fc?style=for-the-badge&logo=python&logoColor=3da9fc)](https://pypi.org/project/EvoScientist/)
45
+ [![Project Page](https://img.shields.io/badge/Project-Page-ff8e3c?style=for-the-badge&logo=googlelens&logoColor=ff8e3c)]()
46
+ [![arXiv](https://img.shields.io/badge/arXiv-xxxx.xxxx-b31b1b?style=for-the-badge&logo=arxiv&logoColor=b31b1b)]()
47
+ [![License](https://img.shields.io/badge/License-MIT-green?style=for-the-badge)]()
48
+ <!-- [![Gradio Demo](https://img.shields.io/badge/Gradio-Online_Demo-FFCC00?style=for-the-badge&logo=gradio&logoColor=yellow&labelColor=grey)]()
49
+ [![Evaluation Split](https://img.shields.io/badge/HF-Test_Dataset-AECBFA?style=for-the-badge&logo=huggingface&logoColor=FFCC00&labelColor=grey)]() -->
50
+
51
+ </div>
52
+
53
+ ## 🔥 News
54
+ > TODO
55
+ - **[27 Sep 2025]** ⛳ Our preprint is now live on [arXiv] — check it out for details.
56
+
57
+
58
+ ## Overview
59
+ > TODO
60
+
61
+
62
+ ## 📖 Contents
63
+ - [⛏️ Installation](#️-installation)
64
+ - [⚡ Quick Start](#-quick-start)
65
+ - [CLI Inference](#cli-inference)
66
+ - [Script Inference](#script-inference)
67
+ - [Web Interface](#web-interface)
68
+ - [📊 Evaluation](#-evaluation)
69
+ - [📝 Citation](#-citation)
70
+ - [📚 Acknowledgments](#-acknowledgments)
71
+ - [📦 Codebase Contributors](#-codebase-contributors)
72
+ - [📜 License](#-license)
73
+
74
+ ## ⛏️ Installation
75
+
76
+ > [!TIP]
77
+ > Use [`uv`](https://pypi.org/project/uv) for installation — it's faster and more reliable than `pip`.
78
+ ### For Development
79
+
80
+ ```Shell
81
+ # Create and activate a conda environment
82
+ conda create -n EvoSci python=3.11 -y
83
+ conda activate EvoSci
84
+
85
+ # Install in development (editable) mode
86
+ pip install EvoScientist
87
+ # or
88
+ pip install -e .
89
+ ```
90
+
91
+ ### Option 1:
92
+ Install the latest version directly from GitHub for quick setup:
93
+ > TODO
94
+ ### Option 2:
95
+ If you plan to modify the code or contribute to the project, you can clone the repository and install it in editable mode:
96
+
97
+ > TODO
98
+
99
+ <details>
100
+ <summary> 🔄 Upgrade to the latest code base </summary>
101
+
102
+ ```Shell
103
+ git pull
104
+ uv pip install -e .
105
+ ```
106
+
107
+ </details>
108
+
109
+ ## ⚡ Quick Start
110
+
111
+ ### CLI Inference
112
+ You can perform inference directly from the command line using our CLI tool:
113
+
114
+ ![demo](./assets/EvoScientist_cli.png)
115
+
116
+ ```Shell
117
+ python -m EvoScientist
118
+ ```
119
+ or
120
+ ```Shell
121
+ EvoSci # or EvoScientist
122
+ ```
123
+ **Optional arguments:**
124
+
125
+ > TODO
126
+
127
+ ### Script Inference
128
+ ```python
129
+ from EvoScientist import EvoScientist_agent
130
+ from langchain_core.messages import HumanMessage
131
+ from EvoScientist.utils import format_messages
132
+
133
+ thread = {"configurable": {"thread_id": "1"}}
134
+ question = "Hi?"
135
+ last_len = 0
136
+
137
+ for state in EvoScientist_agent.stream(
138
+ {"messages": [HumanMessage(content=question)]},
139
+ config=thread,
140
+ stream_mode="values",
141
+ ):
142
+ msgs = state["messages"]
143
+ if len(msgs) > last_len:
144
+ format_messages(msgs[last_len:])
145
+ last_len = len(msgs)
146
+ ```
147
+
148
+ <details>
149
+ <summary> Output </summary>
150
+
151
+ ```json
152
+
153
+ ╭─────────────────────────────────────────────────── 🧑 Human ────────────────────────────────────────────────────╮
154
+ │ Hi? │
155
+ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
156
+ ╭───────────────────────────────────────────────────── 📝 AI ─────────────────────────────────────────────────────╮
157
+ │ Hi! I'm here to help you with experimental research tasks. I can assist with: │
158
+ │ │
159
+ │ - **Planning experiments** - designing stages, success criteria, and workflows │
160
+ │ - **Running experiments** - implementing baselines, training models, analyzing results │
161
+ │ - **Research** - finding papers, methods, datasets, and baselines │
162
+ │ - **Analysis** - computing metrics, creating visualizations, interpreting results │
163
+ │ - **Writing** - drafting experimental reports and documentation │
164
+ │ │
165
+ │ What would you like to work on today? │
166
+ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
167
+ ```
168
+
169
+ </details>
170
+
171
+ ### Web Interface
172
+
173
+ > TODO
174
+
175
+
176
+ ## 📊 Evaluation
177
+
178
+ > TODO
179
+
180
+ ## 📝 Citation
181
+
182
+ If you find our paper and code useful in your research and applications, please cite using this BibTeX:
183
+
184
+ > TODO
185
+
186
+ ## 📚 Acknowledgments
187
+
188
+ This project builds upon the following outstanding open-source works:
189
+
190
+ - [**Deep Agents**](https://github.com/langchain-ai/deepagents) — A framework for building AI agents that can interact with various tools and environments.
191
+ - [**Deep Agents UI**](https://github.com/langchain-ai/deep-agents-ui) — A user interface for visualising and managing Deep Agents.
192
+
193
+ We thank the authors for their valuable contributions to the open-source community.
194
+
195
+
196
+ ## 📦 Codebase Contributors
197
+
198
+ <table>
199
+ <tbody>
200
+ <tr>
201
+ <td align="center">
202
+ <a href="https://youganglyu.github.io/">
203
+ <img src="https://youganglyu.github.io/images/profile.png"
204
+ width="100" height="100"
205
+ style="object-fit: cover; border-radius: 20%;" alt="Yougang Lyu"/>
206
+ <br />
207
+ <sub><b>Yougang Lyu</b></sub>
208
+ </a>
209
+ </td>
210
+ <td align="center">
211
+ <a href="https://x-izhang.github.io/">
212
+ <img src="https://x-izhang.github.io/author/xi-zhang/avatar_hu13660783057866068725.jpg"
213
+ width="100" height="100"
214
+ style="object-fit: cover; border-radius: 20%;" alt="Xi Zhang"/>
215
+ <br />
216
+ <sub><b>Xi Zhang</b></sub>
217
+ </a>
218
+ </td>
219
+ </tr>
220
+ </tbody>
221
+ </table>
222
+
223
+ For any enquiries or collaboration opportunities, please contact: [**youganglyu@gmail.com**](mailto:youganglyu@gmail.com)
224
+
225
+ ## 📜 License
226
+
227
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.