65cec64445
* feat(feishu): add WebSocket long connection subscription mode Add WebSocket (长连接) mode as an alternative to webhook for Feishu event subscription. This allows running without a public IP, port forwarding, or tunnel — ideal for local dev and NAT/firewall setups. - New `feishu_subscription_mode` config: "webhook" (default) or "websocket" - WebSocket mode uses official `lark-oapi` SDK with thread-safe queue bridge - Onboard wizard: mode selection, SDK install prompt for websocket - CLI: `--mode webhook|websocket` for standalone serve - `pip install evoscientist[feishu]` optional dependency - 5 new tests covering config, SDK missing error, message bridge, cleanup - Docs: subscription mode comparison table, prerequisites per mode * Fix: Ruff * Fix: small fix
167 lines
3.8 KiB
TOML
167 lines
3.8 KiB
TOML
[project]
|
||
name = "EvoScientist"
|
||
version = "0.0.3"
|
||
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>=0.4.11",
|
||
"langchain>=1.2.12",
|
||
"langchain-anthropic>=1.4.0",
|
||
"langchain-openai>=1.1",
|
||
"langchain-nvidia-ai-endpoints>=0.3",
|
||
"langchain-google-genai>=4.2.1",
|
||
"langchain-ollama>=1.0",
|
||
"tavily-python>=0.7",
|
||
"pyyaml>=6.0",
|
||
"rich>=14.0",
|
||
"prompt-toolkit>=3.0",
|
||
"questionary>=2.0.1",
|
||
"typer>=0.12",
|
||
"python-dotenv>=1.0",
|
||
"langgraph-cli[inmem]>=0.4",
|
||
"langgraph-checkpoint-sqlite>=3.0.0",
|
||
"httpx>=0.27",
|
||
"markdownify>=0.14",
|
||
"nest-asyncio>=1.6",
|
||
"langchain-mcp-adapters>=0.1",
|
||
"textual>=0.80",
|
||
]
|
||
|
||
[dependency-groups]
|
||
dev = [
|
||
"pytest>=8.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-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"]
|
||
feishu = ["lark-oapi>=1.4.0"]
|
||
qq = ["qq-botpy>=1.0"]
|
||
stt = ["faster-whisper>=1.0"]
|
||
oauth = ["ccproxy-api>=0.2.4"]
|
||
all-channels = [
|
||
"python-telegram-bot>=21.0",
|
||
"discord.py>=2.3",
|
||
"aiohttp>=3.9",
|
||
"slack-sdk>=3.27",
|
||
"pycryptodome>=3.20",
|
||
"lark-oapi>=1.4.0",
|
||
"qq-botpy>=1.0",
|
||
]
|
||
|
||
[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 = ["subagent.yaml", "skills/**/*"]
|
||
|
||
[tool.pytest.ini_options]
|
||
testpaths = ["tests"]
|
||
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
|