diff --git a/.github/assets/badge-pypi-dark.svg b/.github/assets/badge-pypi-dark.svg index 18fc54e..af9b708 100644 --- a/.github/assets/badge-pypi-dark.svg +++ b/.github/assets/badge-pypi-dark.svg @@ -5,5 +5,5 @@ v0.1.9 + font-size="13" font-weight="700" fill="#ffffff">v0.2.0 \ No newline at end of file diff --git a/.github/assets/badge-pypi-light.svg b/.github/assets/badge-pypi-light.svg index a6dd771..f5eebd8 100644 --- a/.github/assets/badge-pypi-light.svg +++ b/.github/assets/badge-pypi-light.svg @@ -5,5 +5,5 @@ v0.1.9 + font-size="13" font-weight="700" fill="#ffffff">v0.2.0 \ No newline at end of file diff --git a/.github/assets/wechat_group.jpeg b/.github/assets/wechat_group.jpeg index a6b1331..b8b3458 100644 Binary files a/.github/assets/wechat_group.jpeg and b/.github/assets/wechat_group.jpeg differ diff --git a/README.md b/README.md index 71f6d66..9be176e 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ - PyPI v0.1.9 + PyPI v0.2.0 @@ -122,11 +122,12 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human ## ✨ Features - **🤖 Multi-Agent Team** — 6 sub-agents (plan, research, code, debug, analyze, write) working in concert. -- **🧠 Self-Evolving Memory** — User profile and observations auto-distilled each turn, growing across sessions. +- **🧠 Self-Evolving Memory** — Auto-distilled each turn, self-linking into a knowledge graph that grows across sessions. - **🌐 Multi-Provider** — Anthropic, OpenAI, Google, MiniMax, NVIDIA — one config to switch. - **📱 Multi-Channel** — CLI as the hub; Telegram, Slack, Feishu, WeChat, and more — one agent session. - **🖥️ Desktop WebUI** — Workspace-panel web app, one terminal via `--ui webui`. - **🔬 Scientific Workflow** — Intake → plan → execute → evaluate → write → verify. +- **⏰ Scheduled Tasks** — Automate recurring research on a cron-style schedule — it runs on its own and reports back. - **🔄 Code Generation Modes** — More Effort (iterative refinement), continuously improving code quality. - **⚡ Adaptive Tools** — Per-turn tool selection keeps only relevant tools visible, reducing noise. - **✂️ Context Editing** — Dynamic system prompt rewriting based on conversation state. @@ -149,6 +150,7 @@ Moving beyond traditional human-in-the-loop systems, EvoScientist adopts a human
📦 Release Highlights — version changelog +- **[26 Jun 2026]** **[v0.2.0](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.0)** — **Autonomy milestone.** Scheduled tasks: cron-style recurring runs you set up with `/schedule` or natural language, running unattended with shell-access gating for safety (#306); self-linking memory that connects related observations into a knowledge graph (complements / contradicts / supersedes) as it grows (#307); a read-only **`GET /api/models`** endpoint exposing the model registry to the WebUI picker (#308); the main agent now always keeps its memory tools available (#305); deps: deepagents 0.6.12 / langchain-quickjs 0.3.2. - **[23 Jun 2026]** **[v0.1.9](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.9)** — Hotfix for fresh installs: the first message crashed with `The subagent `task` tool cannot be exposed via `ptc`` after deepagents 0.6.11 / langchain-quickjs 0.3 reserved `task` as the REPL global. Removed `task` from the code-interpreter PTC allowlist (`task()` stays available as the REPL global; async dispatch stays in PTC) and pinned `deepagents[quickjs]~=0.6.11`. - **[22 Jun 2026]** **[v0.1.8](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.8)** — LangGraph gateway layer: UI-agnostic graph & thread access shared across CLI / TUI / serve / channel; OpenRouter Anthropic prompt caching now **on by default** (opt out with `openrouter_anthropic_prompt_cache=false`); slash-command Enter now submits correctly when a command name prefixes another; pre-commit ruff bump. - **[16 Jun 2026]** **[v0.1.7](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.7)** — Memory retrieval: agents run a per-task preflight over stored observations (`search_observations` ranked keyword search + `read_memory`); multi-stage slash-command completions with subcommand awareness; Windows reliability fixes (async MCP tool execution + graph-state recovery after interruptions, `cmd.exe` path quoting); quoted virtual-path handling; deepagents 0.6.10. diff --git a/README.zh-CN.md b/README.zh-CN.md index aaed297..23157d8 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -15,7 +15,7 @@ - PyPI v0.1.9 + PyPI v0.2.0 @@ -130,11 +130,12 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采 ## ✨ 特性 - **🤖 多智能体协作** — 6 个子智能体(规划、调研、编码、调试、分析、写作)协同工作。 -- **🧠 自进化记忆** — 用户画像与观察记录每轮自动提炼,跨会话持续进化。 +- **🧠 自进化记忆** — 每轮自动提炼并连成知识图谱,跨会话持续进化。 - **🌐 多模型供应商** — Anthropic、OpenAI、Google、MiniMax、NVIDIA——一处配置,随时切换。 - **📱 多渠道接入** — CLI 为中心;Telegram、Slack、飞书、微信等——共享同一智能体会话。 - **🖥️ Desktop WebUI** — 单终端 `--ui webui` 启动带工作区面板的 Web 应用。 - **🔬 科学工作流** — 需求采集 → 规划 → 执行 → 评估 → 撰写 → 验证。 +- **⏰ 定时任务** — 以 cron 风格的计划自动执行重复性研究——自行运行并回报结果。 - **🔄 代码生成模式** — More Effort(迭代精修),持续迭代提升代码生成质量。 - **⚡ 自适应工具** — 每轮对话智能筛选相关工具,减少干扰提升效率。 - **✂️ 上下文编辑** — 根据对话状态动态改写系统提示词。 @@ -158,6 +159,7 @@ EvoScientist 超越了传统的人在回路(Human-in-the-Loop)模式,采
📦 版本更新摘要(changelog) +- **[2026 年 6 月 26 日]** **[v0.2.0](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.2.0)** — **自主化里程碑。** 定时任务:用 `/schedule` 或自然语言设置 cron 风格的重复运行,无人值守执行并对 shell 访问做安全门控(#306);记忆自连成图:相互关联的观察记录连成知识图谱(互补 / 矛盾 / 取代)并持续生长(#307);新增只读 **`GET /api/models`** 端点,向 WebUI 模型选择器暴露模型注册表(#308);主智能体现在始终保留记忆工具(#305);依赖:deepagents 0.6.12 / langchain-quickjs 0.3.2。 - **[2026 年 6 月 23 日]** **[v0.1.9](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.9)** — 新安装热修复:deepagents 0.6.11 / langchain-quickjs 0.3 将 `task` 保留为 REPL 全局后,首次对话即崩溃(`The subagent `task` tool cannot be exposed via `ptc``)。从 code-interpreter 的 PTC 白名单移除 `task`(`task()` 仍作为 REPL 全局可用,异步分发工具继续保留在 PTC 中),并将 deepagents pin 升级到 `~=0.6.11`。 - **[2026 年 6 月 22 日]** **[v0.1.8](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.8)** — LangGraph gateway 层:CLI / TUI / serve / channel 共用、UI 无关的图与线程访问;OpenRouter Anthropic prompt caching **默认开启**(通过 `openrouter_anthropic_prompt_cache=false` 关闭);命令名互为前缀时 Enter 现在能正确提交斜杠命令;pre-commit ruff 升级。 - **[2026 年 6 月 16 日]** **[v0.1.7](https://github.com/EvoScientist/EvoScientist/releases/tag/v0.1.7)** — 记忆检索:agent 在每个任务开始前对历史 observation 做 preflight 检索(`search_observations` 关键词排序检索 + `read_memory`);多级斜杠命令补全(带子命令感知);Windows 稳定性修复(async MCP 工具执行 + 中断后图状态恢复、`cmd.exe` 路径转义);含空格的虚拟路径处理;deepagents 0.6.10。 diff --git a/pyproject.toml b/pyproject.toml index 33de965..14a31fc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "EvoScientist" -version = "0.1.9" +version = "0.2.0" description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery" readme = "README.md" requires-python = ">=3.11" @@ -16,7 +16,7 @@ classifiers = [ "Programming Language :: Python :: 3", ] dependencies = [ - "deepagents[quickjs]~=0.6.11", + "deepagents[quickjs]~=0.6.12", "langchain>=1.3", "langchain-anthropic>=1.4", "langchain-openai>=1.2", diff --git a/uv.lock b/uv.lock index 9214c81..104dd0a 100644 --- a/uv.lock +++ b/uv.lock @@ -860,7 +860,7 @@ wheels = [ [[package]] name = "deepagents" -version = "0.6.11" +version = "0.6.12" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain" }, @@ -870,9 +870,9 @@ dependencies = [ { name = "langsmith" }, { name = "wcmatch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/61/c8aff4d0c3649d02b0090f304917892e7ce7b840b92f86f95751151c1e9c/deepagents-0.6.11.tar.gz", hash = "sha256:c5cb0bc2964ef81d2d81cd26855d7cd3a1dd0b8170c5d451c01a0860f997cae0", size = 205926, upload-time = "2026-06-18T21:05:38.247Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/db/a6acdc72a9e90c3f07ed10de35c951734a02d4facb693bb59684ad368801/deepagents-0.6.12.tar.gz", hash = "sha256:1f281c0bc5a63132f62e2ee345c1dc593b23188da6e23016401f6879fbe54b5f", size = 211364, upload-time = "2026-06-25T17:26:52.775Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/d6/aa/395b0d439f026629b22a5de5cda7b8de25ca456a33abdf3235687cc77c6f/deepagents-0.6.11-py3-none-any.whl", hash = "sha256:b470feaadd7c1519fc2079114e3738c10780417843dd2447141e28046236ac5a", size = 230548, upload-time = "2026-06-18T21:05:36.85Z" }, + { url = "https://files.pythonhosted.org/packages/98/49/af7219b3c13520fee047bb807cfaefba17f8e4584c551d946773589a4f08/deepagents-0.6.12-py3-none-any.whl", hash = "sha256:28b8fa0119ca0a689e3e18e288c4634e4046062acfc87a1cb34289d3af3a1c88", size = 236120, upload-time = "2026-06-25T17:26:51.736Z" }, ] [package.optional-dependencies] @@ -944,7 +944,7 @@ wheels = [ [[package]] name = "evoscientist" -version = "0.1.9" +version = "0.2.0" source = { editable = "." } dependencies = [ { name = "deepagents", extra = ["quickjs"] }, @@ -1048,7 +1048,7 @@ requires-dist = [ { name = "certifi", marker = "extra == 'wechat'", specifier = ">=2024.0" }, { name = "cryptography", marker = "extra == 'all-channels'", specifier = ">=41.0" }, { name = "cryptography", marker = "extra == 'qq'", specifier = ">=41.0" }, - { name = "deepagents", extras = ["quickjs"], specifier = "~=0.6.11" }, + { name = "deepagents", extras = ["quickjs"], specifier = "~=0.6.12" }, { name = "discord-py", marker = "extra == 'all-channels'", specifier = ">=2.3" }, { name = "discord-py", marker = "extra == 'discord'", specifier = ">=2.3" }, { name = "faster-whisper", marker = "extra == 'stt'", specifier = ">=1.0" }, @@ -2012,35 +2012,35 @@ wheels = [ [[package]] name = "langchain" -version = "1.3.9" +version = "1.3.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "langchain-core" }, { name = "langgraph" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/56/7c/651d0dc4913a7a892156c03dd343b99cfe19ee729e6911ab1f4fe7567b8b/langchain-1.3.9.tar.gz", hash = "sha256:9b14ef0db9ef314299ded858b22ca2a40b8f1b05c8c9cb6b82d53a53075fef00", size = 631514, upload-time = "2026-06-12T16:53:27.083Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b9/a2/91a7197c604a3ce1b774b3c10dd114c3c745c6186a304fc2573b3f94d400/langchain-1.3.11.tar.gz", hash = "sha256:f3cf9cd4d2329b1a03eb8fd92b9d73e4e58a4d52570d67725fc77fbe0f104b32", size = 633374, upload-time = "2026-06-22T23:00:33.44Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/55/3481619d21b9bdfbfda8680fba5cfc6cfe926789b8eaaad95353078cfa20/langchain-1.3.9-py3-none-any.whl", hash = "sha256:4af49ad1095799e4408b489fb79d4b8b49292453618b202d8a697fca59bb6871", size = 132873, upload-time = "2026-06-12T16:53:25.489Z" }, + { url = "https://files.pythonhosted.org/packages/df/a4/3a181967294f8876362cc4ba36840d50b8286fa23bb3f5e602b69eb3cb1e/langchain-1.3.11-py3-none-any.whl", hash = "sha256:7ae011f95a09b22feea1e8ae4e43f0b6164aebf4c61b8ad845b45f72ff3a90a2", size = 133639, upload-time = "2026-06-22T23:00:31.619Z" }, ] [[package]] name = "langchain-anthropic" -version = "1.4.6" +version = "1.4.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anthropic" }, { name = "langchain-core" }, { name = "pydantic" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e1/f5/cd397b94aeed5fa0e8ab9595b9fb578ac99f424d42220defe6626e6a1a7b/langchain_anthropic-1.4.6.tar.gz", hash = "sha256:78942d4458d883b7d362438a095ed501ed84f44d402622404482481fc973b9da", size = 706540, upload-time = "2026-06-12T16:54:15.352Z" } +sdist = { url = "https://files.pythonhosted.org/packages/98/22/40ab129b08329ca295b391aa1d48267692b42594757084c6918e22b655ac/langchain_anthropic-1.4.8.tar.gz", hash = "sha256:c76891b2044d56105ff13c106ed12650637b53bd598a4bdf15b4796eefa2a4ec", size = 708524, upload-time = "2026-06-26T21:28:46.916Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/26/af/927dbbc5a1f5fea1a69adc2883f034cbd1430004e36f4eacd302d500393a/langchain_anthropic-1.4.6-py3-none-any.whl", hash = "sha256:dbd412a956b6b8b0716d9d8460ef71f834a6731cdbfc59e6160482a4a9fb5200", size = 51797, upload-time = "2026-06-12T16:54:14.159Z" }, + { url = "https://files.pythonhosted.org/packages/b7/14/746235c4da89d9bc6a608c5f489f628e03feb8f697195c146e452c8f23c8/langchain_anthropic-1.4.8-py3-none-any.whl", hash = "sha256:778e9301b6fd517824f76ec1776975ce8add97a1f6a36c50ae3c2f4b03a66f7f", size = 52366, upload-time = "2026-06-26T21:28:45.535Z" }, ] [[package]] name = "langchain-core" -version = "1.4.7" +version = "1.4.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jsonpatch" }, @@ -2053,9 +2053,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "uuid-utils" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ee/2b/fffaff399d20a56d40b9562fa19701e91abd72d8c9d9bc8c2673077b56b6/langchain_core-1.4.7.tar.gz", hash = "sha256:7a825d77de0a3f39adbd9d09612a75e85527e14a52c1601089bcc062972d9f2b", size = 952522, upload-time = "2026-06-12T19:23:57.588Z" } +sdist = { url = "https://files.pythonhosted.org/packages/12/e3/bea6d0080acf183332f24dcd74c208aee5857cf8f783c3fb0bd86027d8fb/langchain_core-1.4.8.tar.gz", hash = "sha256:5bf1f8411077c904182ad8f975943d36adcbf579c4e017b3a118b719229ebf9a", size = 957974, upload-time = "2026-06-18T19:39:23.636Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/de/3e/dcdffa60078ae7b3a00ebb4cbbf1a204a14c3609983c604886523a7d4418/langchain_core-1.4.7-py3-none-any.whl", hash = "sha256:bcadd51951140ecdcba98311dbd931ba5de02a5ba8a2288dad5069c1eea2a13d", size = 554941, upload-time = "2026-06-12T19:23:55.826Z" }, + { url = "https://files.pythonhosted.org/packages/13/d6/bdf6f0481cc57ef300d6b1eb48cf1400c0409be715d6eb3cabadd1142a09/langchain_core-1.4.8-py3-none-any.whl", hash = "sha256:d84c28b05e3ba8d4271d0827aad5b592ccdaaf986e76768c23503f0a2045e8aa", size = 557416, upload-time = "2026-06-18T19:39:21.902Z" }, ] [[package]] @@ -2144,19 +2144,19 @@ wheels = [ [[package]] name = "langchain-protocol" -version = "0.0.16" +version = "0.0.18" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/e7/8300ba22d968653051fd06e3117d783872dddf3dcebdd6b1d386836eb43c/langchain_protocol-0.0.16.tar.gz", hash = "sha256:806c7cdd951b1c4f692fa40fce60821ff0f221d4360e27673ddf2c2b99c2b7ff", size = 5969, upload-time = "2026-05-28T23:05:11.121Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d2/59/b5959aea96faa9146e2e49a7a22882b3528c62efafe9a6a95beab30c2305/langchain_protocol-0.0.18.tar.gz", hash = "sha256:ec3e11782f1ed0c9db38e5a9ed01b0e7a0d3fba406faa8aef6594b73c56a63e6", size = 6150, upload-time = "2026-06-18T17:08:26.959Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/9c/06dfcc88d02a6364e8d864c421ddd3736305cb0a6c853f75c302c80fe17c/langchain_protocol-0.0.16-py3-none-any.whl", hash = "sha256:3658c142c5d0fb3a023a4be442ce4c15c6d626aab6135eb79a76dc64ad19c3c3", size = 7037, upload-time = "2026-05-28T23:05:10.163Z" }, + { url = "https://files.pythonhosted.org/packages/99/2e/d82db9eec13ad0f72e7aaad5c4bc730ab111934fdc83c85523206eb9b0a0/langchain_protocol-0.0.18-py3-none-any.whl", hash = "sha256:70b53a86fbf9cedc863555effe44da192ab02d556ddbf2cf95b8873adcf41b5a", size = 7221, upload-time = "2026-06-18T17:08:25.996Z" }, ] [[package]] name = "langchain-quickjs" -version = "0.3.1" +version = "0.3.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "bsdiff4" }, @@ -2166,9 +2166,9 @@ dependencies = [ { name = "langgraph" }, { name = "quickjs-rs" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/f8/bb/7fb62b300beed33553c5f05379f0acb7fde11f4189dc438a8208ba5499ed/langchain_quickjs-0.3.1.tar.gz", hash = "sha256:62a958b09ef71f64d13035c6dd0c952e54298a7197b9cb3927cbcdd87ecab90e", size = 222314, upload-time = "2026-06-22T22:49:11.969Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/c2/a683668bb6e9a4eb82cb1081b603ac6c679b096fc321cc61d37da3e14e09/langchain_quickjs-0.3.2.tar.gz", hash = "sha256:61c0546c66e85d860fbee2551701c689db23c23fc46653d76f28a43ca3074d96", size = 227356, upload-time = "2026-06-25T09:39:27.605Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/7b/ac4788998b246062a82975f9e68f44da5d8960920ccc2165d66f975de476/langchain_quickjs-0.3.1-py3-none-any.whl", hash = "sha256:a36ffe889a39eb777990303438002b384b191e0c7b32f9ae0e56e84d16de3b2e", size = 42627, upload-time = "2026-06-22T22:49:10.865Z" }, + { url = "https://files.pythonhosted.org/packages/e1/60/7380a25432d5407edde7ce36c81da1099b8a50f64e0ed2b74d3a1f0deb45/langchain_quickjs-0.3.2-py3-none-any.whl", hash = "sha256:a0267c76f38738dee7dcf0edeab6e6be76238a1a55035b25095aee4bfb6f48d9", size = 45437, upload-time = "2026-06-25T09:39:26.642Z" }, ] [[package]]