Metadata-Version: 2.4
Name: scitex
Version: 2.21.0
Summary: A comprehensive Python library for scientific computing and data analysis
Project-URL: Homepage, https://github.com/ywatanabe1989/scitex-python
Project-URL: Documentation, https://scitex.readthedocs.io
Project-URL: Repository, https://github.com/ywatanabe1989/scitex-python
Project-URL: Bug Tracker, https://github.com/ywatanabe1989/scitex-python/issues
Author-email: Yusuke Watanabe <ywatanabe@scitex.ai>
License: AGPL-3.0
License-File: LICENSE
Keywords: data-analysis,machine-learning,neural-networks,research,scientific-computing,signal-processing
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Scientific/Engineering
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.10
Requires-Dist: natsort
Requires-Dist: numpy
Requires-Dist: packaging
Requires-Dist: pandas
Requires-Dist: pyyaml
Requires-Dist: tqdm
Provides-Extra: ai
Requires-Dist: anthropic; extra == 'ai'
Requires-Dist: google-genai; extra == 'ai'
Requires-Dist: groq; extra == 'ai'
Requires-Dist: imbalanced-learn; extra == 'ai'
Requires-Dist: joblib; extra == 'ai'
Requires-Dist: markdown2; extra == 'ai'
Requires-Dist: matplotlib; extra == 'ai'
Requires-Dist: natsort; extra == 'ai'
Requires-Dist: openai; extra == 'ai'
Requires-Dist: pillow; extra == 'ai'
Requires-Dist: pyyaml; extra == 'ai'
Requires-Dist: requests; extra == 'ai'
Requires-Dist: ruamel-yaml; extra == 'ai'
Requires-Dist: scikit-learn; extra == 'ai'
Requires-Dist: scipy; extra == 'ai'
Requires-Dist: seaborn; extra == 'ai'
Requires-Dist: sktime>=0.21.0; extra == 'ai'
Requires-Dist: umap-learn; extra == 'ai'
Requires-Dist: xarray; extra == 'ai'
Provides-Extra: all
Requires-Dist: aiohttp; extra == 'all'
Requires-Dist: anthropic; extra == 'all'
Requires-Dist: beautifulsoup4; extra == 'all'
Requires-Dist: bibtexparser; extra == 'all'
Requires-Dist: catboost; extra == 'all'
Requires-Dist: click; extra == 'all'
Requires-Dist: connectedpapers-py; extra == 'all'
Requires-Dist: crawl4ai; extra == 'all'
Requires-Dist: crossref-local; extra == 'all'
Requires-Dist: csv2latex; extra == 'all'
Requires-Dist: elevenlabs; extra == 'all'
Requires-Dist: feedparser; extra == 'all'
Requires-Dist: figrecipe>=0.16.0; extra == 'all'
Requires-Dist: flask>=2.0.0; extra == 'all'
Requires-Dist: geom-median; extra == 'all'
Requires-Dist: gitpython; extra == 'all'
Requires-Dist: google-genai; extra == 'all'
Requires-Dist: groq; extra == 'all'
Requires-Dist: gtts; extra == 'all'
Requires-Dist: h5py; extra == 'all'
Requires-Dist: html2text; extra == 'all'
Requires-Dist: httpx; extra == 'all'
Requires-Dist: imbalanced-learn; extra == 'all'
Requires-Dist: ipdb; extra == 'all'
Requires-Dist: ipython; extra == 'all'
Requires-Dist: jax; extra == 'all'
Requires-Dist: joblib; extra == 'all'
Requires-Dist: julius; extra == 'all'
Requires-Dist: lxml; extra == 'all'
Requires-Dist: lxml-html-clean; extra == 'all'
Requires-Dist: markdown; extra == 'all'
Requires-Dist: markdown2; extra == 'all'
Requires-Dist: matplotlib; extra == 'all'
Requires-Dist: mcp; extra == 'all'
Requires-Dist: mne; extra == 'all'
Requires-Dist: mss; extra == 'all'
Requires-Dist: natsort; extra == 'all'
Requires-Dist: nest-asyncio; extra == 'all'
Requires-Dist: numcodecs; extra == 'all'
Requires-Dist: openai; extra == 'all'
Requires-Dist: openalex-local; extra == 'all'
Requires-Dist: opencv-python; extra == 'all'
Requires-Dist: openpyxl; extra == 'all'
Requires-Dist: optuna; extra == 'all'
Requires-Dist: pdfplumber; extra == 'all'
Requires-Dist: piexif; extra == 'all'
Requires-Dist: pillow; extra == 'all'
Requires-Dist: playwright; extra == 'all'
Requires-Dist: playwright>=1.40.0; extra == 'all'
Requires-Dist: plotly; extra == 'all'
Requires-Dist: psutil; extra == 'all'
Requires-Dist: psycopg2-binary; extra == 'all'
Requires-Dist: pyarrow; extra == 'all'
Requires-Dist: pydantic; extra == 'all'
Requires-Dist: pydub; extra == 'all'
Requires-Dist: pymatreader; extra == 'all'
Requires-Dist: pymed; extra == 'all'
Requires-Dist: pymupdf; extra == 'all'
Requires-Dist: pypandoc; extra == 'all'
Requires-Dist: pypdf; extra == 'all'
Requires-Dist: pypdf2; extra == 'all'
Requires-Dist: pyperclip; extra == 'all'
Requires-Dist: pytesseract; extra == 'all'
Requires-Dist: pytest-asyncio; extra == 'all'
Requires-Dist: python-docx; extra == 'all'
Requires-Dist: pytorch-pretrained-vit; extra == 'all'
Requires-Dist: pyttsx3; extra == 'all'
Requires-Dist: pyyaml; extra == 'all'
Requires-Dist: qrcode[pil]; extra == 'all'
Requires-Dist: readability-lxml; extra == 'all'
Requires-Dist: readchar; extra == 'all'
Requires-Dist: requests; extra == 'all'
Requires-Dist: ripple-detection; extra == 'all'
Requires-Dist: ruamel-yaml; extra == 'all'
Requires-Dist: scholarly; extra == 'all'
Requires-Dist: scikit-learn; extra == 'all'
Requires-Dist: scipy; extra == 'all'
Requires-Dist: scitex-writer; extra == 'all'
Requires-Dist: seaborn; extra == 'all'
Requires-Dist: selenium; extra == 'all'
Requires-Dist: sktime>=0.21.0; extra == 'all'
Requires-Dist: socialia>=0.3.1; extra == 'all'
Requires-Dist: sounddevice; extra == 'all'
Requires-Dist: sql-manager; extra == 'all'
Requires-Dist: sqlalchemy; extra == 'all'
Requires-Dist: statsmodels; extra == 'all'
Requires-Dist: sympy; extra == 'all'
Requires-Dist: tabulate; extra == 'all'
Requires-Dist: tenacity; extra == 'all'
Requires-Dist: tensorflow; extra == 'all'
Requires-Dist: tensorpac; extra == 'all'
Requires-Dist: termplotlib; extra == 'all'
Requires-Dist: torch; extra == 'all'
Requires-Dist: torchaudio; extra == 'all'
Requires-Dist: torchsummary; extra == 'all'
Requires-Dist: torchvision; extra == 'all'
Requires-Dist: tqdm; extra == 'all'
Requires-Dist: umap-learn; extra == 'all'
Requires-Dist: watchdog; extra == 'all'
Requires-Dist: webdriver-manager; extra == 'all'
Requires-Dist: xarray; extra == 'all'
Requires-Dist: xlrd; extra == 'all'
Requires-Dist: xlsx2csv; extra == 'all'
Requires-Dist: yq; extra == 'all'
Requires-Dist: zarr; extra == 'all'
Provides-Extra: audio
Requires-Dist: elevenlabs; extra == 'audio'
Requires-Dist: gtts; extra == 'audio'
Requires-Dist: mcp; extra == 'audio'
Requires-Dist: pydub; extra == 'audio'
Requires-Dist: pytest-asyncio; extra == 'audio'
Requires-Dist: pyttsx3; extra == 'audio'
Provides-Extra: audit
Provides-Extra: benchmark
Requires-Dist: psutil; extra == 'benchmark'
Provides-Extra: bridge
Requires-Dist: matplotlib; extra == 'bridge'
Requires-Dist: scipy; extra == 'bridge'
Provides-Extra: browser
Requires-Dist: aiohttp; extra == 'browser'
Requires-Dist: matplotlib; extra == 'browser'
Requires-Dist: playwright>=1.40.0; extra == 'browser'
Provides-Extra: canvas
Requires-Dist: figrecipe>=0.16.0; extra == 'canvas'
Provides-Extra: capture
Requires-Dist: mcp; extra == 'capture'
Requires-Dist: mss; extra == 'capture'
Requires-Dist: pillow; extra == 'capture'
Requires-Dist: playwright>=1.40.0; extra == 'capture'
Provides-Extra: clew
Provides-Extra: cli
Requires-Dist: aiohttp; extra == 'cli'
Requires-Dist: beautifulsoup4; extra == 'cli'
Requires-Dist: click; extra == 'cli'
Requires-Dist: gitpython; extra == 'cli'
Requires-Dist: playwright; extra == 'cli'
Requires-Dist: pyyaml; extra == 'cli'
Requires-Dist: requests; extra == 'cli'
Provides-Extra: cloud
Requires-Dist: matplotlib; extra == 'cloud'
Provides-Extra: compat
Provides-Extra: config
Requires-Dist: pyyaml; extra == 'config'
Provides-Extra: container
Provides-Extra: context
Provides-Extra: cv
Requires-Dist: opencv-python; extra == 'cv'
Requires-Dist: pillow; extra == 'cv'
Provides-Extra: dataset
Provides-Extra: datetime
Provides-Extra: db
Requires-Dist: psycopg2-binary; extra == 'db'
Requires-Dist: sqlalchemy; extra == 'db'
Provides-Extra: decorators
Requires-Dist: joblib; extra == 'decorators'
Requires-Dist: matplotlib; extra == 'decorators'
Requires-Dist: pytest-asyncio; extra == 'decorators'
Requires-Dist: scipy; extra == 'decorators'
Requires-Dist: tqdm; extra == 'decorators'
Requires-Dist: xarray; extra == 'decorators'
Provides-Extra: dev
Requires-Dist: build; extra == 'dev'
Requires-Dist: jedi; extra == 'dev'
Requires-Dist: line-profiler; extra == 'dev'
Requires-Dist: markdown; extra == 'dev'
Requires-Dist: markdown2; extra == 'dev'
Requires-Dist: matplotlib; extra == 'dev'
Requires-Dist: memory-profiler; extra == 'dev'
Requires-Dist: mypy; extra == 'dev'
Requires-Dist: myst-parser; extra == 'dev'
Requires-Dist: pre-commit; extra == 'dev'
Requires-Dist: pygments; extra == 'dev'
Requires-Dist: pyright; extra == 'dev'
Requires-Dist: pytest; extra == 'dev'
Requires-Dist: pytest-asyncio; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest-env; extra == 'dev'
Requires-Dist: pytest-json-report; extra == 'dev'
Requires-Dist: pytest-mock; extra == 'dev'
Requires-Dist: pytest-testmon; extra == 'dev'
Requires-Dist: pytest-timeout; extra == 'dev'
Requires-Dist: pytest-xdist; extra == 'dev'
Requires-Dist: python-lsp-server; extra == 'dev'
Requires-Dist: pyyaml; extra == 'dev'
Requires-Dist: rope; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Requires-Dist: setuptools; extra == 'dev'
Requires-Dist: sphinx; extra == 'dev'
Requires-Dist: sphinx-autobuild; extra == 'dev'
Requires-Dist: sphinx-autodoc-typehints; extra == 'dev'
Requires-Dist: sphinx-rtd-theme; extra == 'dev'
Requires-Dist: stdlib-list; extra == 'dev'
Requires-Dist: tomlkit; extra == 'dev'
Requires-Dist: twine; extra == 'dev'
Requires-Dist: types-pyyaml; extra == 'dev'
Requires-Dist: types-requests; extra == 'dev'
Requires-Dist: types-setuptools; extra == 'dev'
Requires-Dist: wheel; extra == 'dev'
Provides-Extra: devtools
Requires-Dist: joblib; extra == 'devtools'
Requires-Dist: matplotlib; extra == 'devtools'
Requires-Dist: ruamel-yaml; extra == 'devtools'
Requires-Dist: scipy; extra == 'devtools'
Requires-Dist: seaborn; extra == 'devtools'
Requires-Dist: xarray; extra == 'devtools'
Provides-Extra: diagram
Requires-Dist: pyyaml; extra == 'diagram'
Provides-Extra: dict
Provides-Extra: dsp
Requires-Dist: h5py; extra == 'dsp'
Requires-Dist: joblib; extra == 'dsp'
Requires-Dist: matplotlib; extra == 'dsp'
Requires-Dist: readchar; extra == 'dsp'
Requires-Dist: ruamel-yaml; extra == 'dsp'
Requires-Dist: scipy; extra == 'dsp'
Requires-Dist: seaborn; extra == 'dsp'
Requires-Dist: sounddevice; extra == 'dsp'
Requires-Dist: tensorpac; extra == 'dsp'
Requires-Dist: xarray; extra == 'dsp'
Provides-Extra: dt
Requires-Dist: matplotlib; extra == 'dt'
Provides-Extra: etc
Requires-Dist: readchar; extra == 'etc'
Provides-Extra: events
Provides-Extra: gen
Requires-Dist: h5py; extra == 'gen'
Requires-Dist: ipython; extra == 'gen'
Requires-Dist: joblib; extra == 'gen'
Requires-Dist: matplotlib; extra == 'gen'
Requires-Dist: pyperclip; extra == 'gen'
Requires-Dist: readchar; extra == 'gen'
Requires-Dist: requests; extra == 'gen'
Requires-Dist: scipy; extra == 'gen'
Requires-Dist: xarray; extra == 'gen'
Provides-Extra: gists
Provides-Extra: git
Requires-Dist: gitpython; extra == 'git'
Requires-Dist: matplotlib; extra == 'git'
Provides-Extra: heavy
Requires-Dist: catboost; extra == 'heavy'
Requires-Dist: jax; extra == 'heavy'
Requires-Dist: julius; extra == 'heavy'
Requires-Dist: mne; extra == 'heavy'
Requires-Dist: optuna; extra == 'heavy'
Requires-Dist: psutil; extra == 'heavy'
Requires-Dist: pytorch-pretrained-vit; extra == 'heavy'
Requires-Dist: ripple-detection; extra == 'heavy'
Requires-Dist: tensorflow; extra == 'heavy'
Requires-Dist: torch; extra == 'heavy'
Requires-Dist: torchaudio; extra == 'heavy'
Requires-Dist: torchsummary; extra == 'heavy'
Requires-Dist: torchvision; extra == 'heavy'
Requires-Dist: umap-learn; extra == 'heavy'
Provides-Extra: introspect
Provides-Extra: io
Requires-Dist: gitpython; extra == 'io'
Requires-Dist: h5py; extra == 'io'
Requires-Dist: html2text; extra == 'io'
Requires-Dist: joblib; extra == 'io'
Requires-Dist: lxml; extra == 'io'
Requires-Dist: lxml-html-clean; extra == 'io'
Requires-Dist: markdown; extra == 'io'
Requires-Dist: matplotlib; extra == 'io'
Requires-Dist: natsort; extra == 'io'
Requires-Dist: numcodecs; extra == 'io'
Requires-Dist: openpyxl; extra == 'io'
Requires-Dist: pdfplumber; extra == 'io'
Requires-Dist: piexif; extra == 'io'
Requires-Dist: pillow; extra == 'io'
Requires-Dist: plotly; extra == 'io'
Requires-Dist: pyarrow; extra == 'io'
Requires-Dist: pymatreader; extra == 'io'
Requires-Dist: pymupdf; extra == 'io'
Requires-Dist: pypdf; extra == 'io'
Requires-Dist: pypdf2; extra == 'io'
Requires-Dist: python-docx; extra == 'io'
Requires-Dist: pyyaml; extra == 'io'
Requires-Dist: qrcode[pil]; extra == 'io'
Requires-Dist: ruamel-yaml; extra == 'io'
Requires-Dist: scipy; extra == 'io'
Requires-Dist: tqdm; extra == 'io'
Requires-Dist: xarray; extra == 'io'
Requires-Dist: xlrd; extra == 'io'
Requires-Dist: zarr; extra == 'io'
Provides-Extra: linalg
Requires-Dist: geom-median; extra == 'linalg'
Requires-Dist: joblib; extra == 'linalg'
Requires-Dist: matplotlib; extra == 'linalg'
Requires-Dist: scipy; extra == 'linalg'
Requires-Dist: sympy; extra == 'linalg'
Requires-Dist: xarray; extra == 'linalg'
Provides-Extra: logging
Requires-Dist: matplotlib; extra == 'logging'
Provides-Extra: media
Provides-Extra: ml
Requires-Dist: anthropic; extra == 'ml'
Requires-Dist: google-genai; extra == 'ml'
Requires-Dist: groq; extra == 'ml'
Requires-Dist: imbalanced-learn; extra == 'ml'
Requires-Dist: joblib; extra == 'ml'
Requires-Dist: markdown2; extra == 'ml'
Requires-Dist: matplotlib; extra == 'ml'
Requires-Dist: natsort; extra == 'ml'
Requires-Dist: openai; extra == 'ml'
Requires-Dist: pillow; extra == 'ml'
Requires-Dist: pyyaml; extra == 'ml'
Requires-Dist: requests; extra == 'ml'
Requires-Dist: ruamel-yaml; extra == 'ml'
Requires-Dist: scikit-learn; extra == 'ml'
Requires-Dist: scipy; extra == 'ml'
Requires-Dist: seaborn; extra == 'ml'
Requires-Dist: sktime>=0.21.0; extra == 'ml'
Requires-Dist: umap-learn; extra == 'ml'
Requires-Dist: xarray; extra == 'ml'
Provides-Extra: module
Provides-Extra: msword
Requires-Dist: pypandoc; extra == 'msword'
Requires-Dist: python-docx; extra == 'msword'
Provides-Extra: nn
Requires-Dist: h5py; extra == 'nn'
Requires-Dist: ipdb; extra == 'nn'
Requires-Dist: joblib; extra == 'nn'
Requires-Dist: matplotlib; extra == 'nn'
Requires-Dist: readchar; extra == 'nn'
Requires-Dist: ruamel-yaml; extra == 'nn'
Requires-Dist: seaborn; extra == 'nn'
Requires-Dist: tensorpac; extra == 'nn'
Requires-Dist: xarray; extra == 'nn'
Provides-Extra: notebook
Provides-Extra: os
Provides-Extra: parallel
Requires-Dist: tqdm; extra == 'parallel'
Provides-Extra: path
Requires-Dist: gitpython; extra == 'path'
Requires-Dist: matplotlib; extra == 'path'
Provides-Extra: pd
Requires-Dist: xarray; extra == 'pd'
Provides-Extra: plt
Requires-Dist: figrecipe>=0.16.0; extra == 'plt'
Requires-Dist: joblib; extra == 'plt'
Requires-Dist: matplotlib; extra == 'plt'
Requires-Dist: piexif; extra == 'plt'
Requires-Dist: pillow; extra == 'plt'
Requires-Dist: pyyaml; extra == 'plt'
Requires-Dist: ruamel-yaml; extra == 'plt'
Requires-Dist: scipy; extra == 'plt'
Requires-Dist: seaborn; extra == 'plt'
Requires-Dist: termplotlib; extra == 'plt'
Requires-Dist: xarray; extra == 'plt'
Provides-Extra: project
Provides-Extra: repro
Requires-Dist: matplotlib; extra == 'repro'
Provides-Extra: reproduce
Requires-Dist: matplotlib; extra == 'reproduce'
Provides-Extra: resource
Requires-Dist: h5py; extra == 'resource'
Requires-Dist: joblib; extra == 'resource'
Requires-Dist: matplotlib; extra == 'resource'
Requires-Dist: psutil; extra == 'resource'
Requires-Dist: pyyaml; extra == 'resource'
Requires-Dist: readchar; extra == 'resource'
Requires-Dist: ruamel-yaml; extra == 'resource'
Requires-Dist: scipy; extra == 'resource'
Provides-Extra: rng
Requires-Dist: matplotlib; extra == 'rng'
Provides-Extra: schema
Provides-Extra: scholar
Requires-Dist: aiohttp; extra == 'scholar'
Requires-Dist: beautifulsoup4; extra == 'scholar'
Requires-Dist: bibtexparser; extra == 'scholar'
Requires-Dist: connectedpapers-py; extra == 'scholar'
Requires-Dist: crawl4ai; extra == 'scholar'
Requires-Dist: crossref-local; extra == 'scholar'
Requires-Dist: feedparser; extra == 'scholar'
Requires-Dist: html2text; extra == 'scholar'
Requires-Dist: httpx; extra == 'scholar'
Requires-Dist: matplotlib; extra == 'scholar'
Requires-Dist: natsort; extra == 'scholar'
Requires-Dist: nest-asyncio; extra == 'scholar'
Requires-Dist: openalex-local; extra == 'scholar'
Requires-Dist: openpyxl; extra == 'scholar'
Requires-Dist: pdfplumber; extra == 'scholar'
Requires-Dist: pillow; extra == 'scholar'
Requires-Dist: playwright>=1.40.0; extra == 'scholar'
Requires-Dist: pydantic; extra == 'scholar'
Requires-Dist: pymed; extra == 'scholar'
Requires-Dist: pymupdf; extra == 'scholar'
Requires-Dist: pypdf2; extra == 'scholar'
Requires-Dist: pytesseract; extra == 'scholar'
Requires-Dist: python-docx; extra == 'scholar'
Requires-Dist: pyyaml; extra == 'scholar'
Requires-Dist: requests; extra == 'scholar'
Requires-Dist: ruamel-yaml; extra == 'scholar'
Requires-Dist: scholarly; extra == 'scholar'
Requires-Dist: scikit-learn; extra == 'scholar'
Requires-Dist: seaborn; extra == 'scholar'
Requires-Dist: selenium; extra == 'scholar'
Requires-Dist: sql-manager; extra == 'scholar'
Requires-Dist: sqlalchemy; extra == 'scholar'
Requires-Dist: tenacity; extra == 'scholar'
Requires-Dist: tqdm; extra == 'scholar'
Requires-Dist: watchdog; extra == 'scholar'
Requires-Dist: webdriver-manager; extra == 'scholar'
Provides-Extra: scholar-gui
Requires-Dist: click; extra == 'scholar-gui'
Requires-Dist: crossref-local; extra == 'scholar-gui'
Requires-Dist: flask>=2.0.0; extra == 'scholar-gui'
Requires-Dist: openalex-local; extra == 'scholar-gui'
Provides-Extra: security
Provides-Extra: session
Requires-Dist: matplotlib; extra == 'session'
Requires-Dist: pyyaml; extra == 'session'
Provides-Extra: sh
Requires-Dist: matplotlib; extra == 'sh'
Provides-Extra: social
Requires-Dist: socialia>=0.3.1; extra == 'social'
Provides-Extra: stats
Requires-Dist: matplotlib; extra == 'stats'
Requires-Dist: scipy; extra == 'stats'
Requires-Dist: statsmodels; extra == 'stats'
Requires-Dist: tabulate; extra == 'stats'
Provides-Extra: str
Requires-Dist: matplotlib; extra == 'str'
Requires-Dist: natsort; extra == 'str'
Requires-Dist: xarray; extra == 'str'
Provides-Extra: template
Requires-Dist: gitpython; extra == 'template'
Requires-Dist: matplotlib; extra == 'template'
Provides-Extra: tex
Requires-Dist: matplotlib; extra == 'tex'
Provides-Extra: torch
Requires-Dist: torch; extra == 'torch'
Provides-Extra: types
Requires-Dist: xarray; extra == 'types'
Provides-Extra: ui
Provides-Extra: utils
Requires-Dist: h5py; extra == 'utils'
Requires-Dist: matplotlib; extra == 'utils'
Requires-Dist: natsort; extra == 'utils'
Requires-Dist: tqdm; extra == 'utils'
Requires-Dist: xarray; extra == 'utils'
Provides-Extra: verify
Provides-Extra: web
Requires-Dist: aiohttp; extra == 'web'
Requires-Dist: anthropic; extra == 'web'
Requires-Dist: beautifulsoup4; extra == 'web'
Requires-Dist: google-genai; extra == 'web'
Requires-Dist: groq; extra == 'web'
Requires-Dist: joblib; extra == 'web'
Requires-Dist: markdown2; extra == 'web'
Requires-Dist: matplotlib; extra == 'web'
Requires-Dist: openai; extra == 'web'
Requires-Dist: pillow; extra == 'web'
Requires-Dist: pytest-asyncio; extra == 'web'
Requires-Dist: readability-lxml; extra == 'web'
Requires-Dist: requests; extra == 'web'
Requires-Dist: ruamel-yaml; extra == 'web'
Requires-Dist: scikit-learn; extra == 'web'
Requires-Dist: scipy; extra == 'web'
Requires-Dist: seaborn; extra == 'web'
Requires-Dist: tqdm; extra == 'web'
Requires-Dist: xarray; extra == 'web'
Provides-Extra: writer
Requires-Dist: csv2latex; extra == 'writer'
Requires-Dist: gitpython; extra == 'writer'
Requires-Dist: matplotlib; extra == 'writer'
Requires-Dist: pytest-asyncio; extra == 'writer'
Requires-Dist: scitex-writer; extra == 'writer'
Requires-Dist: xlsx2csv; extra == 'writer'
Requires-Dist: yq; extra == 'writer'
Description-Content-Type: text/markdown

<!-- ---
!-- Timestamp: 2026-02-16 10:13:53
!-- Author: ywatanabe
!-- File: /home/ywatanabe/proj/scitex-python/README.md
!-- --- -->

<p align="center">
  <a href="https://scitex.ai">
    <img src="docs/assets/images/scitex-logo-blue-cropped.png" alt="SciTeX" width="400">
  </a>
</p>

<p align="center">
  <a href="https://badge.fury.io/py/scitex"><img src="https://badge.fury.io/py/scitex.svg" alt="PyPI version"></a>
  <a href="https://pypi.org/project/scitex/"><img src="https://img.shields.io/pypi/pyversions/scitex.svg" alt="Python Versions"></a>
  <a href="https://github.com/ywatanabe1989/scitex-python/blob/main/LICENSE"><img src="https://img.shields.io/github/license/ywatanabe1989/scitex-python" alt="License"></a>
  <img src="https://img.shields.io/badge/uv-recommended-blue" alt="uv recommended">
</p>

<p align="center">
  <a href="https://scitex.ai">scitex.ai</a> · <a href="https://scitex-python.readthedocs.io">Read the Docs</a> · <code>pip install scitex</code>
</p>

---

# SciTeX — Modular Python Toolkit for Researchers and AI Agents

>Four Freedoms for Research
>
>0. The freedom to **run** your research anywhere — your machine, your terms.
>1. The freedom to **study** how every step works — from raw data to final manuscript.
>2. The freedom to **redistribute** your workflows, not just your papers.
>3. The freedom to **modify** any module and share improvements with the community.
>
>AGPL-3.0 — because research infrastructure deserves the same freedoms as the software it runs on.

<p align="center">
    <img src="scripts/assets/workflow_out/workflow.png" alt="SciTeX Ecosystem" width="800">
</p>

## 🎬 Demo

**40 min, zero human intervention** — AI agent conducts full research pipeline:

> Literature search → Data analysis → Statistics → Figures → 21-page manuscript → Peer review simulation

<p align="center">
  <a href="https://scitex.ai/demos/watch/scitex-automated-research/" title="▶ Watch full demo at scitex.ai/demos/">
    <img src="docs/assets/images/scitex-demo.gif" alt="SciTeX Demo" width="800">
  </a>
</p>

## 📦 Installation


``` bash
uv pip install scitex          # Core (minimal)
uv pip install scitex[plt,stats,scholar]  # Typical research setup
uv pip install scitex[all]     # Recommended: Full installation
```

## ⚙️ Configuration

Modular environment configuration via `.env.d/`:

<details>

```bash
# 1. Copy examples
cp -r .env.d.examples .env.d

# 2. Edit with your credentials
$EDITOR .env.d/

# 3. Source in shell (~/.bashrc or ~/.zshrc)
source /path/to/.env.d/entry.src
```

**Structure:**
```
.env.d/
├── entry.src              # Single entry point
├── 00_scitex.env          # Base settings (SCITEX_DIR)
├── 00_crossref-local.env  # CrossRef database
├── 00_figrecipe.env       # Plotting config
├── 01_scholar.env         # OpenAthens, API keys
├── 01_audio.env           # TTS backends
└── ...                    # Per-module configs
```

→ **[Full configuration reference](./.env.d.examples/README.md)**

</details>

## Three Interfaces

<details>
<summary><strong>🐍 Python API for Humans and AI Agents</strong></summary>

<br>

**`@stx.session`** — Reproducible Experiment Tracking

```python
import scitex as stx

@stx.session
def main(filename="demo.jpg"):
    fig, ax = stx.plt.subplots()
    ax.plot_line(t, signal)
    ax.set_xyt("Time (s)", "Amplitude", "Title")
    stx.io.save(fig, filename)
    return 0
```

**Output**:
```
script_out/FINISHED_SUCCESS/2025-01-08_12-30-00_AbC1/
├── demo.jpg                    # Figure with embedded metadata
├── demo.csv                    # Auto-exported plot data
├── CONFIGS/CONFIG.yaml         # Reproducible parameters
└── logs/{stdout,stderr}.log    # Execution logs
```

**`stx.io`** — Universal File I/O (30+ formats)

```python
stx.io.save(df, "output.csv")
stx.io.save(fig, "output.jpg")
df = stx.io.load("output.csv")
```

**`stx.stats`** — Publication-Ready Statistics (23 tests)

```python
result = stx.stats.test_ttest_ind(group1, group2, return_as="dataframe")
# Includes: p-value, effect size, CI, normality check, power
```

→ **[Full module status](./docs/MODULE_STATUS.md)**

</details>

<details>
<summary><strong>🖥️ CLI Commands for Humans and AI Agents</strong></summary>

<br>

```bash
scitex --help-recursive              # Show all commands
scitex scholar fetch "10.1038/..."   # Download paper by DOI
scitex scholar bibtex refs.bib       # Enrich BibTeX
scitex stats recommend               # Suggest statistical tests
scitex audio speak "Done"            # Text-to-speech
scitex capture snap                  # Screenshot

# List available APIs and tools
scitex list-python-apis              # List all Python APIs (210 items)
scitex mcp list-tools                # List all MCP tools (120+ tools)
scitex introspect api scitex.stats   # List APIs for specific module
```

→ **[Full CLI reference](./docs/CLI_COMMANDS.md)**

</details>

<details>
<summary><strong>🔧 MCP Tools — 120+ tools for AI Agents</strong></summary>

<br>

Turn AI agents into autonomous scientific researchers.

**Typical workflow**: Scholar (find papers) → Stats (analyze) → Plt (visualize) → Writer (manuscript) → Capture (verify)

| Category | Tools | Description |
|----------|-------|-------------|
| writer | 28 | LaTeX manuscript compilation |
| scholar | 23 | PDF download, metadata enrichment |
| capture | 12 | Screen monitoring and capture |
| introspect | 12 | Python code introspection |
| audio | 10 | Text-to-speech, audio playback |
| stats | 10 | Automated statistical testing |
| plt | 9 | Matplotlib figure creation |
| diagram | 9 | Mermaid and Graphviz diagrams |
| dataset | 8 | Scientific dataset access |
| social | 7 | Social media posting |
| canvas | 7 | Scientific figure canvas |
| template | 6 | Project scaffolding |
| verify | 6 | Reproducibility verification |
| dev | 6 | Ecosystem version management |
| ui | 5 | Notifications |
| linter | 3 | Code pattern checking |

**Claude Desktop** (`~/.config/claude/claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "scitex": {
      "command": "scitex",
      "args": ["mcp", "start"],
      "env": {
        "SCITEX_ENV_SRC": "${SCITEX_ENV_SRC}"
      }
    }
  }
}
```

→ **[Full MCP tool reference](./docs/MCP_TOOLS.md)**

</details>

## 🧩 Standalone Packages

SciTeX integrates several standalone packages that can be used independently:

<details>

| Package | scitex Module | Description |
|---------|--------------|-------------|
| [figrecipe](https://github.com/ywatanabe1989/figrecipe) | `scitex.plt` | Publication-ready matplotlib figures |
| [crossref-local](https://github.com/ywatanabe1989/crossref-local) | `scitex.scholar.crossref_scitex` | Local CrossRef database (167M+ papers) |
| [openalex-local](https://github.com/ywatanabe1989/openalex-local) | `scitex.scholar.openalex_scitex` | Local OpenAlex database (250M+ papers) |
| [socialia](https://github.com/ywatanabe1989/socialia) | `scitex.social` | Social media posting (Twitter, LinkedIn) |
| [scitex-writer](https://github.com/ywatanabe1989/scitex-writer) | `scitex.writer` | LaTeX manuscript compilation |
| [scitex-dataset](https://github.com/ywatanabe1989/scitex-dataset) | `scitex.dataset` | Scientific dataset access |

Each package works standalone or as part of scitex:

```bash
pip install figrecipe        # Use independently
pip install scitex[plt]      # Or via scitex
```

</details>

## 📖 Documentation

- **[Read the Docs](https://scitex-python.readthedocs.io/)**: Complete API reference
- **[Examples](./examples/)**: Usage examples and demonstrations

## 🤝 Contributing

We welcome contributions! See [CONTRIBUTING.md](CONTRIBUTING.md).

---

<p align="center">
  <a href="https://scitex.ai" target="_blank"><img src="docs/assets/images/scitex-icon-navy-inverted.png" alt="SciTeX" width="40"/></a>
  <br>
  AGPL-3.0
</p>

<!-- EOF -->