Metadata-Version: 2.4
Name: scitex
Version: 2.15.2
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; extra == 'ai'
Requires-Dist: umap-learn; extra == 'ai'
Requires-Dist: xarray; extra == 'ai'
Provides-Extra: all
Requires-Dist: accelerate; extra == 'all'
Requires-Dist: aiohttp; extra == 'all'
Requires-Dist: anthropic; extra == 'all'
Requires-Dist: beautifulsoup4; extra == 'all'
Requires-Dist: bibtexparser; extra == 'all'
Requires-Dist: bitsandbytes; extra == 'all'
Requires-Dist: catboost; extra == 'all'
Requires-Dist: celery; extra == 'all'
Requires-Dist: click; extra == 'all'
Requires-Dist: crawl4ai; extra == 'all'
Requires-Dist: csv2latex; extra == 'all'
Requires-Dist: dearpygui; extra == 'all'
Requires-Dist: einops; extra == 'all'
Requires-Dist: elevenlabs; extra == 'all'
Requires-Dist: fairscale; extra == 'all'
Requires-Dist: fastapi; extra == 'all'
Requires-Dist: feedparser; extra == 'all'
Requires-Dist: figrecipe>=0.16.0; extra == 'all'
Requires-Dist: flask; 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: ipykernel; extra == 'all'
Requires-Dist: ipython; extra == 'all'
Requires-Dist: joblib; extra == 'all'
Requires-Dist: julius; extra == 'all'
Requires-Dist: jupyter-collaboration; extra == 'all'
Requires-Dist: jupyterlab; extra == 'all'
Requires-Dist: jupytext; extra == 'all'
Requires-Dist: llvmlite>=0.39.0; extra == 'all'
Requires-Dist: lxml; extra == 'all'
Requires-Dist: lxml-html-clean; extra == 'all'
Requires-Dist: markdown; 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: nbsphinx; extra == 'all'
Requires-Dist: nest-asyncio; extra == 'all'
Requires-Dist: numcodecs; extra == 'all'
Requires-Dist: obspy; extra == 'all'
Requires-Dist: openai; extra == 'all'
Requires-Dist: opencv-python; extra == 'all'
Requires-Dist: openpyxl; extra == 'all'
Requires-Dist: optuna; extra == 'all'
Requires-Dist: papermill; extra == 'all'
Requires-Dist: pdfplumber; extra == 'all'
Requires-Dist: piexif; extra == 'all'
Requires-Dist: pillow; 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: pybids; extra == 'all'
Requires-Dist: pydantic; extra == 'all'
Requires-Dist: pydub; extra == 'all'
Requires-Dist: pyedflib; 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: pyqt6; extra == 'all'
Requires-Dist: pytesseract; extra == 'all'
Requires-Dist: python-docx; extra == 'all'
Requires-Dist: pytorch-optimizer; extra == 'all'
Requires-Dist: pytorch-pretrained-vit; extra == 'all'
Requires-Dist: pyttsx3; 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-image; extra == 'all'
Requires-Dist: scikit-learn; extra == 'all'
Requires-Dist: scipy; extra == 'all'
Requires-Dist: seaborn; extra == 'all'
Requires-Dist: selenium; extra == 'all'
Requires-Dist: sktime; extra == 'all'
Requires-Dist: sounddevice; extra == 'all'
Requires-Dist: sqlalchemy; extra == 'all'
Requires-Dist: statsmodels; extra == 'all'
Requires-Dist: streamlit; extra == 'all'
Requires-Dist: sympy; extra == 'all'
Requires-Dist: tenacity; 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: transformers; extra == 'all'
Requires-Dist: umap-learn>=0.5.4; 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: 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: 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: 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: config
Requires-Dist: pyyaml; extra == 'config'
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: 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: 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: 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: 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: 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: 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: repro
Requires-Dist: matplotlib; extra == 'repro'
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: scholar
Requires-Dist: aiohttp; extra == 'scholar'
Requires-Dist: beautifulsoup4; extra == 'scholar'
Requires-Dist: bibtexparser; extra == 'scholar'
Requires-Dist: crawl4ai; 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: 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: session
Requires-Dist: matplotlib; extra == 'session'
Requires-Dist: pyyaml; extra == 'session'
Provides-Extra: sh
Requires-Dist: matplotlib; extra == 'sh'
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: tex
Requires-Dist: matplotlib; extra == 'tex'
Provides-Extra: torch
Requires-Dist: torch; extra == 'torch'
Provides-Extra: types
Requires-Dist: xarray; extra == 'types'
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: 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: xlsx2csv; extra == 'writer'
Requires-Dist: yq; extra == 'writer'
Description-Content-Type: text/markdown

<!-- ---
!-- Timestamp: 2026-01-20 09:23:14
!-- 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> · <code>pip install scitex</code>
</p>

---

**Modular Python toolkit for scientific research automation — with verification features to ease peer review.**

Empowers both human researchers and AI agents. Each module works independently and adapts to various academic workflows, handling primary and secondary research with real or simulated data.

## 🎬 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[all]     # Recommended: Full installation
uv pip install scitex          # Core only
```

## Three Interfaces

| Interface | For | Description |
|-----------|-----|-------------|
| 🐍 **Python API** | Human researchers | `import scitex as stx` — 70% less code |
| 🖥️ **CLI Commands** | Terminal users | `scitex scholar fetch`, `scitex stats run` |
| 🔧 **MCP Tools** | AI agents | 108 tools for Claude/GPT integration |

<details>
<summary><strong>🐍 Python API</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</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
```

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

</details>

<details>
<summary><strong>🔧 MCP Tools — 108 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 |
|----------|-------|-------------|
| scholar | 23 | PDF download, metadata enrichment |
| stats | 10 | Automated statistical testing |
| plt | 9 | Matplotlib figure creation |
| capture | 12 | Screen monitoring and capture |
| audio | 10 | Text-to-speech, audio playback |
| introspect | 11 | Python introspection |
| diagram | 7 | Mermaid and flowchart creation |
| canvas | 7 | Scientific figure canvas |
| social | 9 | Social media posting |
| template | 4 | Project scaffolding |
| ui | 5 | Notifications |
| writer | 1 | LaTeX manuscript compilation |

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

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

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

</details>

## 📖 Documentation

- **[Read the Docs](https://scitex.readthedocs.io/)**: Complete API reference
- **[Example Notebooks](./examples/notebooks/)**: 25+ Jupyter notebooks

## 🤝 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 · ywatanabe@scitex.ai
</p>

<!-- EOF -->
