release: v0.3.0 (#462)
This commit is contained in:
@@ -5,5 +5,5 @@
|
|||||||
<rect x="54" y="5" width="62" height="24" rx="6" fill="#1565c0"/>
|
<rect x="54" y="5" width="62" height="24" rx="6" fill="#1565c0"/>
|
||||||
<text x="85" y="22" text-anchor="middle"
|
<text x="85" y="22" text-anchor="middle"
|
||||||
font-family="Inter, -apple-system, system-ui, sans-serif"
|
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>
|
</svg>
|
||||||
|
Before Width: | Height: | Size: 556 B After Width: | Height: | Size: 555 B |
@@ -5,5 +5,5 @@
|
|||||||
<rect x="54" y="5" width="62" height="24" rx="6" fill="#2563eb"/>
|
<rect x="54" y="5" width="62" height="24" rx="6" fill="#2563eb"/>
|
||||||
<text x="85" y="22" text-anchor="middle"
|
<text x="85" y="22" text-anchor="middle"
|
||||||
font-family="Inter, -apple-system, system-ui, sans-serif"
|
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>
|
</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 |
@@ -61,12 +61,12 @@ class EvoCodeInterpreterMiddleware(CodeInterpreterMiddleware):
|
|||||||
earlier "conditional snapshot" gate that skipped ``after_agent`` on turns
|
earlier "conditional snapshot" gate that skipped ``after_agent`` on turns
|
||||||
where ``code_interpreter`` wasn't called saved ~50 ms/turn of
|
where ``code_interpreter`` wasn't called saved ~50 ms/turn of
|
||||||
``create_snapshot()`` work, but also skipped the slot eviction upstream
|
``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``).
|
in ``langchain_quickjs.middleware.CodeInterpreterMiddleware.after_agent``).
|
||||||
``before_agent`` restores the REPL on every turn that follows a touched
|
``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
|
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
|
``test_after_agent_evicts_slot_on_untouched_turn`` guards against
|
||||||
reintroducing the gate.
|
reintroducing the gate.
|
||||||
"""
|
"""
|
||||||
@@ -78,11 +78,11 @@ class EvoCodeInterpreterMiddleware(CodeInterpreterMiddleware):
|
|||||||
"""Evict active REPLs on their worker loops before event-loop shutdown."""
|
"""Evict active REPLs on their worker loops before event-loop shutdown."""
|
||||||
registry = self._registry
|
registry = self._registry
|
||||||
with registry._lock:
|
with registry._lock:
|
||||||
thread_ids = tuple(registry._slots)
|
slot_ids = tuple(registry._slots)
|
||||||
for thread_id in thread_ids:
|
for slot_id in slot_ids:
|
||||||
with contextlib.suppress(Exception):
|
with contextlib.suppress(Exception):
|
||||||
await registry.aevict(thread_id)
|
await registry.aevict(slot_id)
|
||||||
self._ptc_tools_by_thread.clear()
|
self._ptc_tools_by_slot.clear()
|
||||||
|
|
||||||
|
|
||||||
_live_interpreters = weakref.WeakSet()
|
_live_interpreters = weakref.WeakSet()
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<a href="https://pypi.org/project/EvoScientist/"><picture>
|
<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: 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">
|
<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>
|
</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: 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">
|
<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>
|
<details>
|
||||||
<summary>📦 Release Highlights — version changelog</summary>
|
<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.
|
- **[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.
|
- **[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.
|
- **[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
@@ -15,7 +15,7 @@
|
|||||||
<a href="https://pypi.org/project/EvoScientist/"><picture>
|
<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: 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">
|
<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>
|
</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: 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">
|
<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>
|
<details>
|
||||||
<summary>📦 版本更新摘要(changelog)</summary>
|
<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 年 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 月 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。
|
- **[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
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "EvoScientist"
|
name = "EvoScientist"
|
||||||
version = "0.2.10"
|
version = "0.3.0"
|
||||||
description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery"
|
description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
@@ -17,6 +17,7 @@ classifiers = [
|
|||||||
]
|
]
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"deepagents[quickjs]~=0.7.6",
|
"deepagents[quickjs]~=0.7.6",
|
||||||
|
"langchain-quickjs>=0.3.7",
|
||||||
"langchain>=1.3",
|
"langchain>=1.3",
|
||||||
"langchain-anthropic>=1.5",
|
"langchain-anthropic>=1.5",
|
||||||
"langchain-openai>=1.2",
|
"langchain-openai>=1.2",
|
||||||
|
|||||||
@@ -104,11 +104,11 @@ def test_after_agent_evicts_slot_on_untouched_turn():
|
|||||||
|
|
||||||
Upstream ``after_agent`` in ``langchain_quickjs/middleware.py`` performs
|
Upstream ``after_agent`` in ``langchain_quickjs/middleware.py`` performs
|
||||||
two things: snapshot the REPL AND evict the slot (``finally:
|
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`` —
|
on any turn that follows a touched one via ``self._registry.get`` —
|
||||||
which is get-or-create. So if ``after_agent`` returns early without
|
which is get-or-create. So if ``after_agent`` returns early without
|
||||||
evicting, one ``ThreadWorker`` + QuickJS Runtime leaks per persistent
|
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
|
Fix: don't override ``after_agent`` / ``aafter_agent`` at all — inherit
|
||||||
upstream's unconditional snapshot+evict behavior. This test creates a
|
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.
|
untouched-state input, and asserts the slot was evicted.
|
||||||
"""
|
"""
|
||||||
mw = create_code_interpreter_middleware()
|
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
|
# Simulate the slot creation that ``before_agent`` performs when it sees
|
||||||
# a prior turn's snapshot payload in state.
|
# a prior turn's snapshot payload in state.
|
||||||
mw._registry.get(tid)
|
mw._registry.get(slot_id)
|
||||||
assert len(mw._registry._slots) == 1
|
assert len(mw._registry._slots) == 1
|
||||||
|
|
||||||
# Untouched-turn state: no ``code_interpreter`` tool call between the
|
# Untouched-turn state: no ``code_interpreter`` tool call between the
|
||||||
# last ``HumanMessage`` and end. Under the earlier buggy gate this
|
# last ``HumanMessage`` and end. Under the earlier buggy gate this
|
||||||
# returned ``{}`` without evicting — leaking the slot created above.
|
# returned ``{}`` without evicting — leaking the slot created above.
|
||||||
untouched_state = {
|
untouched_state = {
|
||||||
|
"_quickjs_slot_id": slot_id,
|
||||||
"_quickjs_snapshot_payload": b"payload-from-prior-turn",
|
"_quickjs_snapshot_payload": b"payload-from-prior-turn",
|
||||||
"messages": [
|
"messages": [
|
||||||
HumanMessage(content="thanks"),
|
HumanMessage(content="thanks"),
|
||||||
|
|||||||
Reference in New Issue
Block a user