8b1451cdda
* feat(runtime): add application-scoped async runtime * refactor(cli): use owned runtime for session stats * refactor(onboard): use the owned async runtime * docs(runtime): record async bridge ownership * refactor(middleware): keep sync fallback synchronous * refactor(mcp): load tools on an owned runtime * refactor(cli): share owned runtime across entry points * refactor(channels): make inbound sync bridge explicit * refactor(stream): run Rich streaming on owned runtime * chore(runtime): remove nest-asyncio dependency * refactor(asyncio): require active loops in async code * docs(runtime): document final event loop ownership * fix(stream): cancel stalled owned streams * fix(cli): recover cleanly from stream cancellation * fix(runtime): drain executor work before shutdown * fix(runtime): terminate cancelled shell process trees * fix(models): let fallback bypass selector failures * fix(cli): reset interrupt handling between turns * docs: rm implementation spec * fix(serve): cancel active turns during shutdown * fix(runtime): protect settlement from waiter cancellation * fix(backends): reject empty shell commands * fix(runtime): terminate descendants after shell exit * fix(mcp): keep standalone discovery off channel loop * fix(cli): own and settle interactive prompt cancellation * fix(serve): keep channel sends off runtime loop * fix(stream): scope cancel context to iterator steps * refactor(serve): require the owned async runtime * fix(channels): keep interactive sends off runtime loop * fix(selector): surface fallback without log spam * test(runtime): normalize Windows shell marker * fix(cli): serialize interactive session turns * fix(shell): bound output drain after termination * fix(ui): do not retry owned runtime failures * fix(shell): allow signal-safe registry reentry * fix(shell): avoid terminating reused process ids * fix(channels): preserve streaming send order * fix(cli): report runtime shutdown timeouts cleanly * fix(mcp): guide async callers to async loader * docs(runtime): clarify reserved async bridge APIs * fix(runtime): bound code interpreter cleanup * test(shell): use active Python for drain regression --------- Co-authored-by: Xi Zhang <106144707+X-iZhang@users.noreply.github.com>
192 lines
4.5 KiB
TOML
192 lines
4.5 KiB
TOML
[project]
|
||
name = "EvoScientist"
|
||
version = "0.2.4"
|
||
description = "EvoScientist: Towards Self-Evolving AI Scientists for End-to-End Scientific Discovery"
|
||
readme = "README.md"
|
||
requires-python = ">=3.11"
|
||
license = "Apache-2.0"
|
||
authors = [
|
||
{ name = "Xi Zhang" },
|
||
]
|
||
maintainers = [
|
||
{ name = "Xi Zhang" },
|
||
]
|
||
keywords = ["ai-scientific", "scientific-discovery", "self-evolving", "ai-scientists", "end-to-end"]
|
||
classifiers = [
|
||
"Programming Language :: Python :: 3",
|
||
]
|
||
dependencies = [
|
||
"deepagents[quickjs]~=0.6.12",
|
||
"langchain>=1.3",
|
||
"langchain-anthropic>=1.4",
|
||
"langchain-openai>=1.2",
|
||
"langchain-deepseek>=1.1",
|
||
"langchain-nvidia-ai-endpoints>=1.2",
|
||
"langchain-google-genai>=4.2",
|
||
"langchain-ollama>=1.1",
|
||
"langchain-openrouter>=0.2.5",
|
||
# 0.11.0+ SSE regressions: teardown noise + mid-turn ReadTimeout
|
||
"openrouter>=0.10.8,<0.11.0",
|
||
"tavily-python>=0.7",
|
||
"pyyaml>=6.0",
|
||
"rich>=15.0",
|
||
"prompt-toolkit>=3.0",
|
||
"questionary>=2.1",
|
||
"typer>=0.24",
|
||
"python-dotenv>=1.0",
|
||
"langgraph-cli[inmem]>=0.4",
|
||
"langgraph-sdk>=0.4",
|
||
"langgraph-checkpoint-sqlite>=3.0",
|
||
"httpx>=0.28",
|
||
"psutil>=6.0",
|
||
"filelock>=3.16",
|
||
"lazy-loader>=0.5",
|
||
"markdownify>=1.2",
|
||
"tzlocal>=5.0",
|
||
"langchain-mcp-adapters>=0.2",
|
||
# <8.2.7: 8.2.7 Kitty "report-all-keys" breaks CJK input on iTerm2
|
||
"textual>=8.0,<8.2.7",
|
||
]
|
||
|
||
[dependency-groups]
|
||
dev = [
|
||
"pytest>=8.0",
|
||
"pytest-asyncio>=1.0",
|
||
"pytest-cov>=5.0",
|
||
"pytest-timeout>=2.4",
|
||
"ruff>=0.5",
|
||
"build>=1.0",
|
||
"pre-commit>=3.5.0",
|
||
]
|
||
|
||
[project.optional-dependencies]
|
||
dev = [
|
||
"pytest>=8.0",
|
||
"pytest-asyncio>=1.0",
|
||
"pytest-cov>=5.0",
|
||
"pytest-timeout>=2.4",
|
||
"ruff>=0.5",
|
||
"build>=1.0",
|
||
"pre-commit>=3.5.0",
|
||
]
|
||
telegram = ["python-telegram-bot>=21.0"]
|
||
discord = ["discord.py>=2.3"]
|
||
slack = ["slack-sdk>=3.27", "aiohttp>=3.9"]
|
||
wechat = ["pycryptodome>=3.20", "aiohttp>=3.9", "qrcode>=7.4", "certifi>=2024.0"]
|
||
feishu = ["lark-oapi>=1.4.0"]
|
||
qq = [
|
||
"qq-botpy>=1.0",
|
||
"cryptography>=41.0",
|
||
"qrcode>=7.4",
|
||
]
|
||
stt = ["faster-whisper>=1.0"]
|
||
oauth = ["ccproxy-api>=0.2.7"]
|
||
all-channels = [
|
||
"python-telegram-bot>=21.0",
|
||
"discord.py>=2.3",
|
||
"aiohttp>=3.9",
|
||
"slack-sdk>=3.27",
|
||
"pycryptodome>=3.20",
|
||
"qrcode>=7.4",
|
||
"certifi>=2024.0",
|
||
"lark-oapi>=1.4.0",
|
||
"qq-botpy>=1.0",
|
||
"cryptography>=41.0",
|
||
"qrcode>=7.4",
|
||
]
|
||
|
||
[project.urls]
|
||
"Homepage" = "https://github.com/EvoScientist/EvoScientist"
|
||
"Bug Tracker" = "https://github.com/EvoScientist/EvoScientist/issues"
|
||
"Documentation" = "https://github.com/EvoScientist/EvoScientist#readme"
|
||
|
||
[project.scripts]
|
||
evoscientist = "EvoScientist.cli:main"
|
||
EvoScientist = "EvoScientist.cli:main"
|
||
evosci = "EvoScientist.cli:main"
|
||
EvoSci = "EvoScientist.cli:main"
|
||
|
||
[build-system]
|
||
requires = ["setuptools>=68.0"]
|
||
build-backend = "setuptools.build_meta"
|
||
|
||
[tool.setuptools.packages.find]
|
||
include = ["EvoScientist*"]
|
||
|
||
[tool.setuptools.package-data]
|
||
EvoScientist = [
|
||
"subagents/*.yaml",
|
||
"langgraph_dev/*.json",
|
||
"skills/**/*",
|
||
]
|
||
|
||
[tool.pytest.ini_options]
|
||
testpaths = ["tests"]
|
||
asyncio_mode = "auto"
|
||
asyncio_default_fixture_loop_scope = "function"
|
||
filterwarnings = [
|
||
"ignore::UserWarning:langchain_nvidia_ai_endpoints",
|
||
]
|
||
|
||
[tool.ruff]
|
||
# Exclude a variety of commonly ignored directories.
|
||
exclude = [
|
||
".bzr",
|
||
".direnv",
|
||
".eggs",
|
||
".git",
|
||
".git-rewrite",
|
||
".hg",
|
||
".ipynb_checkpoints",
|
||
".mypy_cache",
|
||
".nox",
|
||
".pants.d",
|
||
".pyenv",
|
||
".pytest_cache",
|
||
".pytype",
|
||
".ruff_cache",
|
||
".svn",
|
||
".tox",
|
||
".venv",
|
||
".vscode",
|
||
"__pypackages__",
|
||
"_build",
|
||
"buck-out",
|
||
"build",
|
||
"dist",
|
||
"node_modules",
|
||
"site-packages",
|
||
"venv",
|
||
]
|
||
|
||
line-length = 88
|
||
indent-width = 4
|
||
target-version = "py311"
|
||
|
||
[tool.ruff.lint]
|
||
select = [
|
||
"E", "W", # pycodestyle (Error & Warning)
|
||
"F", # Pyflakes (Logical errors)
|
||
"I", # isort (Import sorting)
|
||
"B", # flake8-bugbear (Common bugs)
|
||
"C4", # flake8-comprehensions (List/Dict perf)
|
||
"UP", # pyupgrade (Modern Python syntax)
|
||
"PT", # flake8-pytest-style (If using Pytest)
|
||
"PLE", # Pylint Error
|
||
"RUF", # Ruff specific rules
|
||
"FURB", # Refurb rules
|
||
]
|
||
ignore = [
|
||
"E501", # Formatter takes care of that
|
||
]
|
||
fixable = ["ALL"]
|
||
unfixable = []
|
||
allowed-confusables = ["–", "❯", ":", "(", ")", ","]
|
||
|
||
[tool.ruff.format]
|
||
quote-style = "double"
|
||
indent-style = "space"
|
||
skip-magic-trailing-comma = false
|
||
line-ending = "auto"
|
||
docstring-code-format = false
|