* fix: update OpenRouter API key validation to use /auth/key endpoint and httpx

* Refactor code structure for improved readability and maintainability

* feat: enhance welcome banner to include file commands indication

* feat: update LaTeX setup prompt to use selection UI for better user experience

* feat: update version to v0.0.5 in badges and project configuration
This commit is contained in:
Xi Zhang
2026-03-27 20:03:36 +01:00
committed by GitHub
parent 6dc8a25579
commit d3284ee881
10 changed files with 66 additions and 42 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 492 KiB

+1 -1
View File
@@ -5,5 +5,5 @@
<rect x="54" y="5" width="62" height="24" rx="6" fill="#1565c0"/>
<text x="85" y="22" text-anchor="middle"
font-family="Inter, -apple-system, system-ui, sans-serif"
font-size="13" font-weight="700" fill="#ffffff">v0.0.4</text>
font-size="13" font-weight="700" fill="#ffffff">v0.0.5</text>
</svg>

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 555 B

+1 -1
View File
@@ -5,5 +5,5 @@
<rect x="54" y="5" width="62" height="24" rx="6" fill="#2563eb"/>
<text x="85" y="22" text-anchor="middle"
font-family="Inter, -apple-system, system-ui, sans-serif"
font-size="13" font-weight="700" fill="#ffffff">v0.0.4</text>
font-size="13" font-weight="700" fill="#ffffff">v0.0.5</text>
</svg>

Before

Width:  |  Height:  |  Size: 555 B

After

Width:  |  Height:  |  Size: 555 B

+2
View File
@@ -120,6 +120,8 @@ def print_banner(
info.append(" \u2022 Type ", style="#ffe082")
info.append("/", style="#ffe082 bold")
info.append(" for commands", style="#ffe082")
info.append(" \u2022 ", style="#ffe082")
info.append("@ files", style="#ffe082 bold")
info.append(" \u2022 Ctrl+C ", style="#ffe082")
info.append("interrupt", style="#ffe082 bold")
console.print(info)
+2
View File
@@ -115,6 +115,8 @@ def _build_welcome_banner(
info.append(" \u2022 Type ", style="#ffe082")
info.append("/", style="#ffe082 bold")
info.append(" for commands", style="#ffe082")
info.append(" \u2022 ", style="#ffe082")
info.append("@ files", style="#ffe082 bold")
info.append(" \u2022 Ctrl+C ", style="#ffe082")
info.append("interrupt", style="#ffe082 bold")
banner.append_text(info)
+18 -16
View File
@@ -337,7 +337,7 @@ def validate_siliconflow_key(api_key: str) -> tuple[bool, str]:
def validate_openrouter_key(api_key: str) -> tuple[bool, str]:
"""Validate an OpenRouter API key by making a test request.
"""Validate an OpenRouter API key via the authenticated /auth/key endpoint.
Returns:
Tuple of (is_valid, message).
@@ -346,20 +346,17 @@ def validate_openrouter_key(api_key: str) -> tuple[bool, str]:
return True, "Skipped (no key provided)"
try:
import openai
import httpx
client = openai.OpenAI(api_key=api_key, base_url="https://openrouter.ai/api/v1")
client.models.list()
return True, "Valid"
resp = httpx.get(
"https://openrouter.ai/api/v1/auth/key",
headers={"Authorization": f"Bearer {api_key}"},
timeout=10,
)
if resp.status_code == 200:
return True, "Valid"
return False, "Invalid API key"
except Exception as e:
error_str = str(e).lower()
if (
"401" in error_str
or "unauthorized" in error_str
or "invalid" in error_str
or "authentication" in error_str
):
return False, "Invalid API key"
return False, f"Error: {e}"
@@ -1717,9 +1714,14 @@ def _step_tinytex() -> None:
when none is found. The agent can auto-install missing LaTeX packages at
runtime via ``tlmgr``, so only the base TinyTeX is needed here.
"""
prepare = questionary.confirm(
"Prepare LaTeX environment? (needed to compile .tex → .pdf)",
default=True,
latex_choices = [
Choice(title="No need (skip LaTeX setup)", value=False),
Choice(title="Install now (TinyTeX compiler)", value=True),
]
prepare = questionary.select(
"LaTeX environment (needed to compile .tex → .pdf):",
choices=latex_choices,
default=False,
style=WIZARD_STYLE,
qmark=QMARK,
).ask()
+16 -8
View File
@@ -10,7 +10,7 @@
<a href="https://pypi.org/project/EvoScientist/"><picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-dark.svg">
<img alt="PyPI v0.0.4" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
<img alt="PyPI v0.0.5" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
</picture></a><a href="https://EvoScientist.github.io/"><picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-website-light.svg">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-website-dark.svg">
@@ -47,14 +47,14 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human
<table>
<tr>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_awards.JPG" height="180" alt="ICAIS 2025 Awards"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_data.png" height="180" alt="AstaBench Data Analysis #1"/>
<br />
<sub><b>Best Paper & Appraisal Award</b></sub>
<sub><b>#1 on AstaBench Data Analysis</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_best_paper.png" height="180" alt="Best Paper"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_code.png" height="180" alt="AstaBench Code & Execution #1"/>
<br />
<sub><b>AI-Generated Best Paper</b></sub>
<sub><b>#1 on AstaBench Code & Execution</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/deepresearch_bench_2.JPG" height="180" alt="DeepResearch Bench II #1"/>
@@ -62,9 +62,16 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human
<sub><b>#1 on DeepResearch Bench II</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_code.png" height="180" alt="AstaBench Code & Execution #1"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_awards.JPG" height="180" alt="ICAIS 2025 Awards"/>
<br />
<sub><b>#1 on AstaBench Code & Execution</b></sub>
<sub><b>Best Paper & Appraisal Award</b></sub>
</td>
</tr>
<tr>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_best_paper.png" height="180" alt="Best Paper"/>
<br />
<sub><b>AI-Generated Best Paper</b></sub>
</td>
</tr>
</table>
@@ -102,7 +109,8 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human
> Looking for ready-to-use research skills? Check out [**EvoSkills**](https://github.com/EvoScientist/EvoSkills) — powered by [**EvoScientist**](https://github.com/EvoScientist/EvoScientist)'s engine and installable skills, the entire end-to-end research lifecycle is covered out of the box. [**EvoSkills**](https://github.com/EvoScientist/EvoSkills) are also compatible with other CLI coding agents.
## 🔥 News
- **[25 Mar 2026]** 🥇 Ranked #1 on [AstaBench Code & Execution](https://huggingface.co/spaces/allenai/asta-bench-leaderboard) at submission time! [**Leaderboard**](https://allenai-asta-bench-leaderboard.hf.space/code-execution) 👈
- **[26 Jun 2026]** 🥇 Ranked #1 on [AstaBench Data Analysis](https://allenai-asta-bench-leaderboard.hf.space/home) at submission time! [**Leaderboard**](https://allenai-asta-bench-leaderboard.hf.space/data-analysis) 👈
- **[25 Mar 2026]** 🥇 Ranked #1 on [AstaBench Code & Execution](https://allenai-asta-bench-leaderboard.hf.space/home) at submission time! [**Leaderboard**](https://allenai-asta-bench-leaderboard.hf.space/code-execution) 👈
- **[13 Mar 2026]** 🚀 [**EvoScientist**](https://github.com/EvoScientist/EvoScientist) officially debuts!
- **[11 Mar 2026]** ⛳ Technical Report is live! [**Check it out**](https://arxiv.org/abs/2603.08127) 👈
- **[06 Mar 2026]** 🥇 Ranked #1 on [DeepResearch Bench II](https://agentresearchlab.com/benchmarks/deepresearch-bench-ii/index.html#leaderboard) at submission time! [**Leaderboard**](https://agentresearchlab.com/benchmarks/deepresearch-bench-ii/index.html#leaderboard) 👈
+16 -8
View File
@@ -15,7 +15,7 @@
<a href="https://pypi.org/project/EvoScientist/"><picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-dark.svg">
<img alt="PyPI v0.0.4" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
<img alt="PyPI v0.0.5" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
</picture></a><a href="https://EvoScientist.github.io/"><picture>
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-website-light.svg">
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-website-dark.svg">
@@ -54,14 +54,14 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采
<table>
<tr>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_awards.JPG" height="180" alt="ICAIS 2025 Awards"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_data.png" height="180" alt="AstaBench Data Analysis #1"/>
<br />
<sub><b>Best Paper & Appraisal Award</b></sub>
<sub><b>AstaBench 数据分析榜 第一名</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_best_paper.png" height="180" alt="Best Paper"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_code.png" height="180" alt="AstaBench Code & Execution #1"/>
<br />
<sub><b>AI-Generated Best Paper</b></sub>
<sub><b>AstaBench 代码与执行榜 第一名</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/deepresearch_bench_2.JPG" height="180" alt="DeepResearch Bench II #1"/>
@@ -69,9 +69,16 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采
<sub><b>DeepResearch Bench II 第一名</b></sub>
</td>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/asta_bench_code.png" height="180" alt="AstaBench Code & Execution #1"/>
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_awards.JPG" height="180" alt="ICAIS 2025 Awards"/>
<br />
<sub><b>AstaBench 代码与执行榜 第一名</b></sub>
<sub><b>Best Paper & Appraisal Award</b></sub>
</td>
</tr>
<tr>
<td align="center" valign="top" width="25%">
<img src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/ICAIS_best_paper.png" height="180" alt="Best Paper"/>
<br />
<sub><b>AI-Generated Best Paper</b></sub>
</td>
</tr>
</table>
@@ -111,7 +118,8 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采
## 🔥 动态
- **[2026 年 3 月 25 日]** 🥇 提交时在 [AstaBench 代码与执行](https://huggingface.co/spaces/allenai/asta-bench-leaderboard) 排名第一![**排行榜**](https://allenai-asta-bench-leaderboard.hf.space/code-execution) 👈
- **[2026 年 6 月 26 日]** 🥇 提交时在 [AstaBench 数据分析](https://allenai-asta-bench-leaderboard.hf.space/home) 排名第一![**排行榜**](https://allenai-asta-bench-leaderboard.hf.space/data-analysis) 👈
- **[2026 年 3 月 25 日]** 🥇 提交时在 [AstaBench 代码与执行](https://allenai-asta-bench-leaderboard.hf.space/home) 排名第一![**排行榜**](https://allenai-asta-bench-leaderboard.hf.space/code-execution) 👈
- **[2026 年 3 月 13 日]** 🚀 [**EvoScientist**](https://github.com/EvoScientist/EvoScientist) 正式亮相!
- **[2026 年 3 月 11 日]** ⛳ 技术报告已上线![**查看详情**](https://arxiv.org/abs/2603.08127) 👈
- **[2026 年 3 月 6 日]** 🥇 提交时在 [DeepResearch Bench II](https://agentresearchlab.com/benchmarks/deepresearch-bench-ii/index.html#leaderboard) 排名第一![**排行榜**](https://agentresearchlab.com/benchmarks/deepresearch-bench-ii/index.html#leaderboard) 👈
+1 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "EvoScientist"
version = "0.0.4"
version = "0.0.5"
description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery"
readme = "README.md"
requires-python = ">=3.11"
+9 -7
View File
@@ -1248,7 +1248,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_step_skipped") as mock_ps,
patch("EvoScientist.config.onboard.console"),
):
mock_q.confirm.return_value.ask.return_value = False
mock_q.select.return_value.ask.return_value = False
_step_tinytex()
mock_ps.assert_called_once_with("LaTeX", "skipped")
@@ -1269,7 +1269,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_latex_status") as mock_status,
patch("EvoScientist.config.onboard.console"),
):
mock_q.confirm.return_value.ask.return_value = True
mock_q.select.return_value.ask.return_value = True
_step_tinytex()
mock_status.assert_called_once()
@@ -1291,7 +1291,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._auto_install_latexmk") as mock_auto,
patch("EvoScientist.config.onboard.console"),
):
mock_q.confirm.return_value.ask.return_value = True
mock_q.select.return_value.ask.return_value = True
_step_tinytex()
mock_auto.assert_called_once()
@@ -1319,6 +1319,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_latex_status"),
patch("EvoScientist.config.onboard.console"),
):
mock_q.select.return_value.ask.return_value = True
mock_q.confirm.return_value.ask.return_value = True
_step_tinytex()
mock_pr.assert_called_once_with("LaTeX", "TinyTeX installed")
@@ -1341,8 +1342,8 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_step_skipped") as mock_ps,
patch("EvoScientist.config.onboard.console"),
):
# First confirm (prepare) = True, second confirm (install) = False
mock_q.confirm.return_value.ask.side_effect = [True, False]
mock_q.select.return_value.ask.return_value = True
mock_q.confirm.return_value.ask.return_value = False
_step_tinytex()
mock_ps.assert_called_once_with("LaTeX", "skipped")
@@ -1368,6 +1369,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_step_result") as mock_pr,
patch("EvoScientist.config.onboard.console"),
):
mock_q.select.return_value.ask.return_value = True
mock_q.confirm.return_value.ask.return_value = True
_step_tinytex()
mock_pr.assert_called_once_with(
@@ -1396,6 +1398,7 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_step_result") as mock_pr,
patch("EvoScientist.config.onboard.console") as mock_con,
):
mock_q.select.return_value.ask.return_value = True
mock_q.confirm.return_value.ask.return_value = True
_step_tinytex()
path_warning_printed = any(
@@ -1424,7 +1427,6 @@ class TestStepTinytex:
patch("EvoScientist.config.onboard._print_step_skipped") as mock_ps,
patch("EvoScientist.config.onboard.console"),
):
# Only one confirm call (prepare=True), no second confirm for manual
mock_q.confirm.return_value.ask.return_value = True
mock_q.select.return_value.ask.return_value = True
_step_tinytex()
mock_ps.assert_called_once_with("LaTeX", "manual install needed")