Files
EvoScientist-Multi/pyproject.toml
T
m4 4c338ed914 fix(merge): resolve integration gaps found by running the v0.3.0 test suite
Post-merge validation fixes (upstream v0.3.0 + Ai4Sci fork):

- llm/patches.py: restore the two module-level patch calls the merge dropped
  (_patch_openai_empty_sse_keepalive, _patch_deepagents_extracted_document_text)
  and make _is_ccproxy_codex accept an explicit base_url/api_key so the
  invocation plan can classify an endpoint without mutating the process env.
- llm/models.py: an explicit per-call plan now wins over
  EVOSCIENTIST_USE_RESPONSES_API (env is only a default), an explicit caller
  `reasoning` block survives an explicit use_responses_api=False, and the
  third-party (openrouter) default effort stays the fork's fixed `medium`.
- EvoScientist.py: sub-agent stacks pass NO_OP_SINK as `events` instead of None.
- middleware/error_normalization.py: platform-generated diagnostics
  (ModelOutputTruncatedError) keep their actionable text while provider SDK
  errors still get the canned redacted message.
- pyproject.toml: hold google-genai 1.x (langchain-google-genai>=4.3.7,<4.4)
  because llm/gemini_interactions.py drives the 1.x Interactions API; this is
  also what deepagents 0.7.13 requires.
- config/settings.py: restore upstream's use_responses_api config field.
  `reasoning_effort` stays deleted on purpose — Ai4Sci keeps reasoning an
  invocation-plan parameter, never a deployment-env override.
- tests: align upstream tests that encode replaced behaviour (ccproxy
  responses-api context, reasoning-effort-overrides-env, fingerprint coverage)
  with the fork's contracts.
2026-09-13 16:57:03 +08:00

209 lines
5.2 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[project]
name = "EvoScientist"
dynamic = ["version"]
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.7.6",
"langchain-quickjs>=0.3.7",
"firecrawl-anydoc>=0.1.6,<0.2",
"pillow>=10.0",
"langchain>=1.3",
"langchain-anthropic>=1.5",
"langchain-openai>=1.2",
"langchain-deepseek>=1.1",
"langchain-nvidia-ai-endpoints>=1.2",
# Ai4Sci: llm/gemini_interactions.py drives google.genai's Interactions API.
# google-genai 2.x redesigned that API (private `_interactions` -> a different
# public `interactions` surface), so hold the 1.x SDK until we port the transport.
# 4.3.7 is the last langchain-google-genai that still admits google-genai 1.x,
# and it is also what deepagents 0.7.13 requires (>=4.3.7,<5.0.0).
"langchain-google-genai>=4.3.7,<4.4",
"google-genai>=1.74,<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",
"rfc8785==0.1.4",
"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.3.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.dynamic]
version = { attr = "EvoScientist._version.__version__" }
[tool.setuptools.package-data]
EvoScientist = [
"subagents/*.yaml",
"langgraph_dev/*.json",
"native_sandbox_runtime/*.json",
"skills/**/*",
]
[tool.setuptools.exclude-package-data]
"*" = ["**/__pycache__/*", "**/*.pyc", "**/*.pyo"]
[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