Metadata-Version: 2.4
Name: budgetforge
Version: 0.1.1
Summary: BudgetForge SDK — LLM proxy with budget enforcement
Home-page: https://github.com/maxialab/budgetforge
Author: MAXIA
Author-email: majorel.alexis@gmail.com
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Intended Audience :: Developers
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=3.8
Description-Content-Type: text/markdown
Requires-Dist: httpx>=0.24.0
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: description-content-type
Dynamic: home-page
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

# BudgetForge SDK Simple

SDK lÃ©ger et simple pour intÃ©grer BudgetForge dans vos projets Python.

## Installation

Aucune installation nÃ©cessaire ! Copiez simplement le fichier `budgetforge_sdk.py` dans votre projet.

```python
from budgetforge_sdk import BudgetForgeLLM, BudgetForgeChat
```

## Utilisation rapide

### LLM simple

```python
from budgetforge_sdk import BudgetForgeLLM

llm = BudgetForgeLLM(
    api_key="votre-cle-api-budgetforge",
    model="gpt-4",
    provider="openai"
)

response = llm.invoke("Bonjour, comment vas-tu?")
print(response)
```

### Chat simple

```python
from budgetforge_sdk import BudgetForgeChat

chat = BudgetForgeChat(
    api_key="votre-cle-api-budgetforge",
    model="claude-3-sonnet",
    provider="anthropic"
)

messages = [
    {"role": "user", "content": "Bonjour!"},
    {"role": "assistant", "content": "Bonjour! Comment puis-je vous aider?"},
    {"role": "user", "content": "Explique-moi l'IA"}
]

result = chat.invoke(messages)
print(result["content"])
```

### Streaming

```python
# Streaming LLM
for chunk in llm.stream("Raconte-moi une histoire:"):
    print(chunk, end="", flush=True)

# Streaming Chat
for generation in chat.stream(messages):
    print(generation["content"], end="", flush=True)
```

## Configuration

### ParamÃ¨tres du LLM

- `api_key`: Votre clÃ© API BudgetForge
- `model`: ModÃ¨le cible ("gpt-4", "claude-3-sonnet", etc.)
- `provider`: Fournisseur ("openai", "anthropic", "google", etc.)
- `api_base_url`: URL de base de l'API (dÃ©faut: localhost:8000)
- `max_tokens`: Nombre maximum de tokens par appel
- `temperature`: TempÃ©rature de rÃ©ponse (0.0-2.0)
- `timeout`: Timeout des requÃªtes en secondes

### FonctionnalitÃ©s BudgetForge

Le SDK bÃ©nÃ©ficie automatiquement de toutes les fonctionnalitÃ©s BudgetForge :

- âœ… **Enforcement du budget** - Les appels sont bloquÃ©s si le budget est dÃ©passÃ©
- âœ… **Tracking des coÃ»ts** - Suivi en temps rÃ©el des dÃ©penses par projet
- âœ… **Fallback automatique** - Bascule vers des providers moins chers
- âœ… **Alertes** - Notifications email/webhook pour les seuils de budget
- âœ… **Analytics dÃ©taillÃ©es** - Breakdown par provider, modÃ¨le, agent

## Exemples avancÃ©s

### Appel asynchrone

```python
import asyncio

async def main():
    llm = BudgetForgeLLM(api_key="votre-cle")
    response = await llm.invoke_async("Question asynchrone")
    print(response)

asyncio.run(main())
```

### ParamÃ¨tres personnalisÃ©s

```python
llm = BudgetForgeLLM(
    api_key="votre-cle",
    model="gpt-4",
    temperature=0.5,
    max_tokens=500,
    timeout=60
)

# ParamÃ¨tres par appel
response = llm.invoke(
    "Prompt complexe",
    temperature=0.8,
    max_tokens=1000
)
```

### Multi-providers

```python
# DiffÃ©rents providers pour diffÃ©rents usages
openai_llm = BudgetForgeLLM(api_key="cle", model="gpt-4", provider="openai")
anthropic_llm = BudgetForgeLLM(api_key="cle", model="claude-3-sonnet", provider="anthropic")

# Utiliser le provider appropriÃ© pour chaque tÃ¢che
complex_task = openai_llm.invoke("Analyse complexe...")
creative_task = anthropic_llm.invoke("TÃ¢che crÃ©ative...")
```

## Gestion des erreurs

```python
try:
    response = llm.invoke("Votre prompt")
except ValueError as e:
    if "budget exceeded" in str(e).lower():
        print("Budget Ã©puisÃ©!")
    elif "provider unavailable" in str(e).lower():
        print("Provider indisponible")
    else:
        print(f"Erreur: {e}")
```

## IntÃ©gration avec d'autres frameworks

### Langchain (manuellement)

```python
from langchain.llms.base import LLM
from typing import Optional, List

class BudgetForgeLangchainWrapper(LLM):
    def __init__(self, api_key: str, model: str = "gpt-4", provider: str = "openai"):
        super().__init__()
        self.budgetforge_llm = BudgetForgeLLM(api_key, model, provider)
    
    def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
        return self.budgetforge_llm.invoke(prompt)
    
    @property
    def _llm_type(self) -> str:
        return "budgetforge"

# Utilisation
llm = BudgetForgeLangchainWrapper(api_key="votre-cle")
```

## Support

- **Documentation**: [BudgetForge Docs](https://budget.maxiaworld.app/docs)
- **Issues**: [GitHub Issues](https://github.com/maxia-lab/budgetforge/issues)
- **Email**: ceo@maxiaworld.app

## Licence

MIT License
