Metadata-Version: 2.4
Name: iil-researchfw
Version: 0.6.0
Summary: Platform research framework — search, citations, analysis, export
Project-URL: Homepage, https://github.com/achimdehnert/researchfw
Project-URL: Repository, https://github.com/achimdehnert/researchfw
Project-URL: Issues, https://github.com/achimdehnert/researchfw/issues
Project-URL: Changelog, https://github.com/achimdehnert/researchfw/blob/main/CHANGELOG.md
License: MIT
Keywords: academic,async,citations,research,search
Classifier: Development Status :: 3 - Alpha
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Information Analysis
Requires-Python: >=3.10
Requires-Dist: anyio<5,>=4.4
Requires-Dist: httpx<1,>=0.27
Requires-Dist: pydantic<3,>=2.7
Requires-Dist: tenacity<9,>=8.3
Provides-Extra: all
Requires-Dist: beautifulsoup4>=4.12; extra == 'all'
Requires-Dist: markdown>=3.5; extra == 'all'
Requires-Dist: playwright>=1.40; extra == 'all'
Requires-Dist: python-docx>=1.1; extra == 'all'
Requires-Dist: types-python-docx; extra == 'all'
Provides-Extra: dev
Requires-Dist: coverage[toml]>=7.5; extra == 'dev'
Requires-Dist: mypy>=1.10; extra == 'dev'
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
Requires-Dist: pytest>=8.0; extra == 'dev'
Requires-Dist: respx>=0.21; extra == 'dev'
Requires-Dist: ruff==0.9.10; extra == 'dev'
Provides-Extra: export
Requires-Dist: markdown>=3.5; extra == 'export'
Requires-Dist: python-docx>=1.1; extra == 'export'
Requires-Dist: types-python-docx; extra == 'export'
Provides-Extra: scraping
Requires-Dist: beautifulsoup4>=4.12; extra == 'scraping'
Requires-Dist: playwright>=1.40; extra == 'scraping'
Description-Content-Type: text/markdown

# iil-researchfw

**Platform research framework** — async search, citations, analysis, export.

[![PyPI](https://img.shields.io/pypi/v/iil-researchfw)](https://pypi.org/project/iil-researchfw/)
[![Python](https://img.shields.io/pypi/pyversions/iil-researchfw)](https://pypi.org/project/iil-researchfw/)
[![CI](https://github.com/achimdehnert/researchfw/actions/workflows/ci.yml/badge.svg)](https://github.com/achimdehnert/researchfw/actions)

## Features

- **Async-first**: `asyncio.gather()` für parallele API-Calls (arXiv, Semantic Scholar, PubMed, OpenAlex)
- **Brave Search**: Web-Search via Brave API
- **Citations**: APA, MLA, Chicago, Harvard, IEEE, Vancouver + BibTeX/RIS
- **AI Summary**: LLM-agnostisch via `LLMCallable` Protocol
- **Export**: Markdown, LaTeX, DOCX
- **Rate Limiting**: Token-Bucket per API-Endpoint
- **Retry**: `tenacity` Exponential Backoff

## Installation

```bash
pip install iil-researchfw
pip install iil-researchfw[export]     # + python-docx, markdown
pip install iil-researchfw[scraping]   # + beautifulsoup4, playwright
pip install iil-researchfw[all]        # alles
```

## Quick Start

```python
import asyncio
from iil_researchfw.search.academic import AcademicSearchService
from iil_researchfw.search.brave import BraveSearchService
from iil_researchfw.citations.formatter import CitationService, CitationStyle

async def main():
    # Academic Search
    academic = AcademicSearchService()
    papers = await academic.search("machine learning transformers", max_results=10)
    for p in papers:
        print(f"{p.title} — {p.source}")

    # Web Search
    brave = BraveSearchService(api_key="your-key")  # or BRAVE_API_KEY env var
    results = await brave.search("Python asyncio best practices")

    # Citations
    citations = CitationService()
    citation = await citations.from_doi("10.1145/3290605.3300233")
    print(citation.format(CitationStyle.APA))

asyncio.run(main())
```

## Architecture

See [ADR-105](https://github.com/achimdehnert/platform/blob/main/docs/adr/ADR-105-iil-researchfw-extraction-plan.md).

## License

MIT
