Metadata-Version: 2.4
Name: clovis
Version: 0.5.1
Summary: cloooooo — SGLang + RAG hybrid + tools + router + structured outputs + eval
Author: Clovis Sfeir
License: MIT
Keywords: ai,llm,local-ai,ollama,openai
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 :: Artificial Intelligence
Requires-Python: >=3.10
Requires-Dist: bm25s>=0.2
Requires-Dist: ddgs>=0.1
Requires-Dist: fastapi>=0.111
Requires-Dist: fastembed>=0.3
Requires-Dist: httpx>=0.27
Requires-Dist: jsonschema>=4.0
Requires-Dist: lancedb>=0.6
Requires-Dist: ollama>=0.3
Requires-Dist: pillow>=10.0
Requires-Dist: pydantic>=2.0
Requires-Dist: pymupdf>=1.24
Requires-Dist: python-docx>=1.1
Requires-Dist: rich>=13.0
Requires-Dist: trafilatura>=2.0
Requires-Dist: typer>=0.12
Requires-Dist: uvicorn[standard]>=0.30
Description-Content-Type: text/markdown

# clovis

Client Python personnel pour un LLM local via [Ollama](https://ollama.com). Interface ultra-simple : `prompt`, `negative_prompt`, `thinking`, `context`.

## Install

```bash
pip install clovis
```

## Usage

```python
from clovis import cloooooo

ai = cloooooo()

# Appel direct
print(ai("Explique les trous noirs"))

# Avec options
print(ai(
    "Génère un poème sur la mer",
    negative_prompt="pas de rimes",
    thinking=True,
    context="Tu es un poète du 19e siècle.",
))

# Streaming token par token
for token in ai.stream("Raconte une histoire courte"):
    print(token, end="", flush=True)

# Conversation avec mémoire
conv = ai.conversation(context="Tu es un expert en finance.")
conv("Explique le CAPM")
conv("Et ses limites ?")  # se souvient de la réponse précédente
```

## CLI

```bash
clovis "Explique les trous noirs"           # question directe
clovis "Génère un poème" --no "sans rimes"  # avec negative prompt
clovis "Résous ce problème" --think          # mode réflexion
clovis repl                                  # conversation interactive
clovis serve --port 8000                     # démarre le serveur API
```

## API server

```bash
clovis serve --port 8000 --key sk-montoken
```

Requête :

```bash
curl -X POST http://localhost:8000/ia \
  -H "Authorization: Bearer sk-montoken" \
  -H "Content-Type: application/json" \
  -d '{"prompt": "Bonjour !", "thinking": false}'
```

Réponse : `{"response": "Bonjour ! Comment puis-je t'aider ?"}`

Streaming : ajouter `"stream": true` → réponse en `text/plain` token par token.

## Config

```bash
export CLOVIS_MODEL="qwen3-72b-q5km"        # modèle Ollama
export CLOVIS_OLLAMA_URL="http://localhost:11434"
export CLOVIS_API_KEY="sk-..."              # clé API pour le serveur
```
