Metadata-Version: 2.5
Name: inferkit
Version: 0.1.10
Summary: Dynamic AI inference kit - deploy any ML/Vision/LLM function with one command
Project-URL: Homepage, https://github.com/MohammadvHossein/inferkit
Project-URL: Repository, https://github.com/MohammadvHossein/inferkit
Project-URL: Issues, https://github.com/MohammadvHossein/inferkit/issues
Project-URL: Changelog, https://github.com/MohammadvHossein/inferkit/blob/main/CHANGELOG.md
License: MIT
License-File: LICENSE
Keywords: ai,fastapi,inference,llm,ml,vision
Classifier: Framework :: FastAPI
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
Requires-Python: >=3.11
Requires-Dist: fastapi>=0.110
Requires-Dist: pydantic-settings>=2.1
Requires-Dist: python-multipart>=0.0.9
Requires-Dist: slowapi>=0.1.9
Requires-Dist: uvicorn[standard]>=0.29
Provides-Extra: all
Requires-Dist: accelerate>=0.27; extra == 'all'
Requires-Dist: pillow>=10; extra == 'all'
Requires-Dist: torch>=2.0; extra == 'all'
Requires-Dist: torchvision>=0.15; extra == 'all'
Requires-Dist: transformers>=4.40; extra == 'all'
Provides-Extra: dev
Requires-Dist: anyio>=4; extra == 'dev'
Requires-Dist: httpx>=0.28; extra == 'dev'
Requires-Dist: mypy>=1.11; extra == 'dev'
Requires-Dist: pillow>=10; extra == 'dev'
Requires-Dist: pytest-cov>=5; extra == 'dev'
Requires-Dist: pytest>=8; extra == 'dev'
Requires-Dist: ruff>=0.9; extra == 'dev'
Provides-Extra: docs
Requires-Dist: mkdocs-material>=9.5; extra == 'docs'
Requires-Dist: mkdocs>=1.5; extra == 'docs'
Provides-Extra: torch
Requires-Dist: torch>=2.0; extra == 'torch'
Requires-Dist: torchvision>=0.15; extra == 'torch'
Provides-Extra: transformers
Requires-Dist: accelerate>=0.27; extra == 'transformers'
Requires-Dist: transformers>=4.40; extra == 'transformers'
Provides-Extra: vision
Requires-Dist: pillow>=10; extra == 'vision'
Description-Content-Type: text/markdown

# InferKit - Deploy any AI function in 3 lines

Library for ML / Vision / LLM / Agent. No FastAPI boilerplate needed.

## Install
```bash
pip install inferkit              # core (no Pillow)
pip install inferkit[vision]      # + Pillow for image in/out
pip install inferkit[torch,transformers]  # heavy ML stacks
pip install -e .[dev]             # local dev
```

## Usage - 3 lines
```python
# my_model.py
from inferkit import infer

@infer
async def run(payload, files=None):
    # payload: {"text": "..."}  files: list[bytes] for images/audio
    return {"output": f"echo: {payload.get('text')}"}

@infer.stream  # optional for LLM streaming
async def run_stream(payload):
    for tok in payload.get("text","").split():
        yield tok + " "
```

Run:
```bash
inferkit serve my_model.py --port 8001
# docs at http://localhost:8001/docs
```

Endpoints auto created:
- `POST /api/v1/infer` (multipart file + json)
- `POST /api/v1/infer/json` (json only)
- `POST /api/v1/infer/stream` (SSE)
- `WS /ws/infer` and `WS /api/v1/ws/infer` (WebSocket + streaming)

Image output helpers:
```python
from inferkit import image_to_base64, bytes_to_response
from PIL import Image
return image_to_base64(Image.new("RGB",(512,512),"red"))
return bytes_to_response(png_bytes, "image/png")
# also still supported: return {"image_base64": b64} or return png_bytes
```

## Init new project
```bash
inferkit init
# creates .env.example, .env, Dockerfile, my_model.py
```

## Deploy (one command, any OS, auto detects Docker)
```bash
inferkit deploy
# if docker available -> docker compose/build
# else -> venv + uvicorn on INFERKIT_HOST:INFERKIT_PORT
```

## Config via .env
```
INFERKIT_APP_NAME=InferKit   # Swagger title - custom service name
INFERKIT_HOST=0.0.0.0
INFERKIT_PORT=8000
INFERKIT_CORS_ORIGINS=["*"]   # or * or http://a.com,http://b.com
INFERKIT_MAX_UPLOAD_MB=50
INFERKIT_RATE_LIMIT=60/minute
INFERKIT_API_KEY=            # if set, require X-API-Key header (also ?api_key=)
INFERKIT_DEBUG=false
# API pruning per project (set false to hide from Swagger):
INFERKIT_ENABLE_MULTIPART=true
INFERKIT_ENABLE_JSON=true
INFERKIT_ENABLE_STREAM=true
INFERKIT_ENABLE_WS=true
# plain HOST/PORT/CORS_ORIGINS also work for backwards compat
```

## Customization

**Service name (easiest):**
```bash
# .env
INFERKIT_APP_NAME=MyService
```
```python
# code (overrides .env)
from inferkit.server import create_app
app = create_app(title="MyService")
```

**Prune APIs per project:**
```bash
# only JSON, hide multipart/stream/WS
INFERKIT_ENABLE_MULTIPART=false
INFERKIT_ENABLE_STREAM=false
INFERKIT_ENABLE_WS=false
```
```python
app = create_app(enable_multipart=False, enable_stream=False, enable_ws=False)
# stream is auto-hidden if no @infer.stream is defined
```

## Tutorial (0 to 100)

Complete guide with training and checkpoint: [`tutorial/00-100-complete-guide.md`](tutorial/00-100-complete-guide.md)

```bash
python tutorial/train_example.py      # train and save checkpoints/model.pkl
inferkit serve tutorial/inference_example.py --port 8001  # serve
```

## Programmatic
```python
from inferkit import serve
serve("my_model.py", port=8000)
```

## Documentation

- `docs/index.md` - Usage
- `docs/api.md` - API Reference
- `docs/vision.md` - Vision example
- `docs/tutorial.md` - Tutorial index
