fdafebd47f
* feat: add STT voice transcription for all channels Automatically transcribes audio/voice messages (Telegram, WeChat, Slack, etc.) into text before the agent sees them. Enabled via config, off by default. Changes: - EvoScientist/stt.py: new STT engine using faster-whisper with lazy model loading and per-language model selection (zh/en/auto) - EvoScientist/channels/base.py: hook in _enqueue_raw() to transcribe audio files and prepend transcript to message text; removes the raw [voice: ...] annotation after successful transcription so the agent does not attempt further audio processing - EvoScientist/config/settings.py: stt_enabled (default False), stt_language (default "auto") - pyproject.toml: optional [stt] dependency group (faster-whisper>=1.0) - tests/test_stt.py: unit tests covering all backends and channel integration Usage: pip install 'EvoScientist[stt]' EvoSci config set stt_enabled true EvoSci config set stt_language zh # zh / en / auto Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: remove unused imports (ruff F401) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: address PR #28 reviewer feedback Changes per SemiGlassFace review (CHANGES_REQUESTED): 1. Cache config at channel __init__ — no longer calls load_config() on every incoming message; STT settings stored as instance attributes (_stt_enabled, _stt_language, _stt_model, _stt_device, _stt_compute_type) set once during Channel.__init__(). 2. Replace deprecated asyncio.get_event_loop() with get_running_loop() to avoid DeprecationWarning on Python 3.12+. 3. Annotation removal now uses exact path matching instead of substring search — checks fp == a or a.endswith(f": {fp}]") so only the correct annotation is removed after transcription. 4. Expose stt_model, stt_device, stt_compute_type as config fields so users can override the HuggingFace model id, inference device, and quantisation without touching code. transcribe_file() forwards all three to the engine. Also: _engines dict replaced with single _engine + _engine_key tuple (model_id, device, compute_type) — reuses cached model unless settings change, simpler than a dict. Tests: 19 STT-specific tests all pass; total 1105 tests green, ruff clean. * fix: resolve ruff lint errors (UP037, I001, PT006) * style: apply ruff format --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
165 lines
3.7 KiB
TOML
165 lines
3.7 KiB
TOML
[project]
|
||
name = "EvoScientist"
|
||
version = "0.0.2"
|
||
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"]
|
||
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",
|
||
"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
|