release: v0.3.0 (#462)

This commit is contained in:
Xi Zhang
2026-09-11 21:45:42 +01:00
committed by GitHub
parent 0410b40f57
commit 418abca4f4
9 changed files with 556 additions and 509 deletions
+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.2.10</text>
font-size="13" font-weight="700" fill="#ffffff">v0.3.0</text>
</svg>

Before

Width:  |  Height:  |  Size: 556 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.2.10</text>
font-size="13" font-weight="700" fill="#ffffff">v0.3.0</text>
</svg>

Before

Width:  |  Height:  |  Size: 556 B

After

Width:  |  Height:  |  Size: 555 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 253 KiB

After

Width:  |  Height:  |  Size: 221 KiB

+7 -7
View File
@@ -61,12 +61,12 @@ class EvoCodeInterpreterMiddleware(CodeInterpreterMiddleware):
earlier "conditional snapshot" gate that skipped ``after_agent`` on turns
where ``code_interpreter`` wasn't called saved ~50 ms/turn of
``create_snapshot()`` work, but also skipped the slot eviction upstream
performs in the same hook (``finally: self._registry.evict(thread_id)``
performs in the same hook (``finally: self._registry.evict(slot_id)``
in ``langchain_quickjs.middleware.CodeInterpreterMiddleware.after_agent``).
``before_agent`` restores the REPL on every turn that follows a touched
one via ``self._registry.get(thread_id)`` (get-or-create), so skipping
one via ``self._registry.get(slot_id)`` (get-or-create), so skipping
eviction leaked one ``ThreadWorker`` + QuickJS Runtime per persistent
``thread_id`` that ever went touched → quiet. The regression test
slot that ever went touched → quiet. The regression test
``test_after_agent_evicts_slot_on_untouched_turn`` guards against
reintroducing the gate.
"""
@@ -78,11 +78,11 @@ class EvoCodeInterpreterMiddleware(CodeInterpreterMiddleware):
"""Evict active REPLs on their worker loops before event-loop shutdown."""
registry = self._registry
with registry._lock:
thread_ids = tuple(registry._slots)
for thread_id in thread_ids:
slot_ids = tuple(registry._slots)
for slot_id in slot_ids:
with contextlib.suppress(Exception):
await registry.aevict(thread_id)
self._ptc_tools_by_thread.clear()
await registry.aevict(slot_id)
self._ptc_tools_by_slot.clear()
_live_interpreters = weakref.WeakSet()
+2 -1
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.2.10" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
<img alt="PyPI v0.3.0" 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">
@@ -151,6 +151,7 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human
<details>
<summary>📦 Release Highlights — version changelog</summary>
- **[11 Sep 2026]** **[v0.3.0](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.3.0)** — Async sub-agents follow the caller's model; mid-session expert install without `/new`; MiniMax multi-turn fix; channel retry and OpenRouter attribution fixes.
- **[05 Sep 2026]** **[v0.2.10](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.10)** — New models: Claude Fable 5.1, GPT-6 Astra, Gemini 3.8 Flash, and Meta Muse Spark 1.3; proactivity phase 1: a first-contact profile bootstrap that eases cold start; optional acceptance checklists for scheduled tasks; tool selection only kicks in above 42 tools; deepagents 0.7.13.
- **[29 Aug 2026]** **[v0.2.9](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.9)** — New models: GLM-5.3-Flash (Zhipu + OpenRouter), Qwen3.8-Flash (DashScope + OpenRouter), and Tencent HY4 preview (OpenRouter), all with 1M context; deepagents 0.7.11.
- **[21 Aug 2026]** **[v0.2.8](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.8)** — Deploy-mode graph rebuilds drop from ~15 s to under a second; resume commands no longer crash and empty session history; Novita AI as a new LLM provider; NVIDIA BioNeMo Agent Toolkit in onboarding's recommended skill packs; bounded routed reasoning with empty truncations surfaced as errors; a subscription OAuth recipe in the docs; deepagents 0.7.8.
+2 -1
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.2.10" src="https://raw.githubusercontent.com/EvoScientist/EvoScientist/main/.github/assets/badge-pypi-light.svg" height="28">
<img alt="PyPI v0.3.0" 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">
@@ -160,6 +160,7 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采
<details>
<summary>📦 版本更新摘要(changelog)</summary>
- **[2026 年 9 月 11 日]** **[v0.3.0](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.3.0)** — 异步子智能体跟随调用方模型;expert 安装即用,无需 `/new`;修复 MiniMax 多轮崩溃、渠道重试与 OpenRouter 归因问题。
- **[2026 年 9 月 5 日]** **[v0.2.10](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.10)** — 新增模型:Claude Fable 5.1、GPT-6 Astra、Gemini 3.8 Flash、Meta Muse Spark 1.3;主动性第一阶段:首次对话建立用户档案,缓解冷启动;定时任务可附加验收清单;工具选择器仅在工具超过 42 个时启用;升级 deepagents 0.7.13。
- **[2026 年 8 月 29 日]** **[v0.2.9](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.9)** — 新增模型:GLM-5.3-Flash(智谱与 OpenRouter)、Qwen3.8-Flash(DashScope 与 OpenRouter)、腾讯 HY4 preview(OpenRouter),均为 1M 上下文;升级 deepagents 0.7.11。
- **[2026 年 8 月 21 日]** **[v0.2.8](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.8)** — deploy 模式图重建从约 15 秒降至 1 秒内;resume 命令不再崩溃清空会话历史;新增 Novita AI provider;onboard 推荐技能包新增 NVIDIA BioNeMo Agent Toolkit;路由 reasoning 参数收敛、空截断显式报错;文档新增订阅 OAuth 配置指南;升级 deepagents 0.7.8。
+2 -1
View File
@@ -1,6 +1,6 @@
[project]
name = "EvoScientist"
version = "0.2.10"
version = "0.3.0"
description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery"
readme = "README.md"
requires-python = ">=3.11"
@@ -17,6 +17,7 @@ classifiers = [
]
dependencies = [
"deepagents[quickjs]~=0.7.6",
"langchain-quickjs>=0.3.7",
"langchain>=1.3",
"langchain-anthropic>=1.5",
"langchain-openai>=1.2",
+5 -4
View File
@@ -104,11 +104,11 @@ def test_after_agent_evicts_slot_on_untouched_turn():
Upstream ``after_agent`` in ``langchain_quickjs/middleware.py`` performs
two things: snapshot the REPL AND evict the slot (``finally:
self._registry.evict(thread_id)``). ``before_agent`` restores the REPL
self._registry.evict(slot_id)``). ``before_agent`` restores the REPL
on any turn that follows a touched one via ``self._registry.get`` —
which is get-or-create. So if ``after_agent`` returns early without
evicting, one ``ThreadWorker`` + QuickJS Runtime leaks per persistent
``thread_id`` that ever went touched → quiet.
slot that ever went touched → quiet.
Fix: don't override ``after_agent`` / ``aafter_agent`` at all — inherit
upstream's unconditional snapshot+evict behavior. This test creates a
@@ -116,17 +116,18 @@ def test_after_agent_evicts_slot_on_untouched_turn():
untouched-state input, and asserts the slot was evicted.
"""
mw = create_code_interpreter_middleware()
tid = mw._fallback_thread_id
slot_id = mw._slot_update_for_runtime()["_quickjs_slot_id"]
# Simulate the slot creation that ``before_agent`` performs when it sees
# a prior turn's snapshot payload in state.
mw._registry.get(tid)
mw._registry.get(slot_id)
assert len(mw._registry._slots) == 1
# Untouched-turn state: no ``code_interpreter`` tool call between the
# last ``HumanMessage`` and end. Under the earlier buggy gate this
# returned ``{}`` without evicting — leaking the slot created above.
untouched_state = {
"_quickjs_slot_id": slot_id,
"_quickjs_snapshot_payload": b"payload-from-prior-turn",
"messages": [
HumanMessage(content="thanks"),
Generated
+536 -493
View File
File diff suppressed because it is too large Load Diff