sivchari pour agents : framework de gestion de skills
L’évaluation des agents LLM souffre d’un manque de rigueur méthodologique. sans un cadre de test strict, l’ajout d’une nouvelle capacité (skill) peut dégrader les performances existantes de manière imperceptible.
Le framework sivchari pour agents propose une approche de type ‘unit testing’ pour les capacités d’IA. Il permet de transformer des fonctions Python arbitraires en composants testables et mesurables avec des métriques de précision et de latence.
Après lecture, vous saurez définir un skill, implémenter un suite de tests automatisés et interpréter les rapports de performance générés par la CLI.
🛠️ Prérequis
Environnement Linux ou macOS recommandé. Python 3.12+ est indispensable pour profiter des annotations de type avancées.
- Python 3.12.x
- pip ou uv (recommandé pour la gestion des dépendances)
- Installation :
pip install sivchari
📚 Comprendre sivchari pour agents
Le paradigme repose sur la dissociation entre l’implémentation du skill et son évaluation. Un skill n’est pas une simple fonction, c’est un contrat d’interface.
Structure d’un cycle de vie sivchari pour agents :
[Définition (Interface)]
|
[Implémentation (Logic)]
|
[Test (Input/Output)] <--- [Métrique (Latency/Accuracy)]
|
[Amélioration (Refactoring)]
Contrairement à LangChain qui se concentre sur l'orchestration (le "flow"), sivchastre se concentre sur la validation de l'atome de base : la compétence. On utilise ici le principe de 'Contract Testing' appliqué aux LLM. Si le schema Pydantic change, le test échoue immédiatement avant même l'appel au modèle.
🐍 Le code — sivchari pour agents
📖 Explication
Dans BaseSkill, l'utilisation de abc.ABC et @abstractmethod garantit que toute implémentation respecte l'interface. C'est crucial pour la polymorphie dans sivchari pour agents.
Le choix de async/await dans execute est délibéré. Les appels aux LLM ou aux API sont des opérations I/O bound. Utiliser asyncio permet de lancer plusieurs tests en parallèle sans bloquer l'event loop, augmentant la vitesse d'évaluation par un facteur 5 sur des suites de tests massives.
Attention au piège de time.time() : utilisez toujours time.perf_counter() pour mesurer la latence. time.time() peut être affecté par les mises à jour de l'horloge système (NTP sync), ce qui fausserait vos métriques de performance.
Documentation officielle Python
🔄 Second exemple
Référence pratique
Voici comment manipuler sivchari pour agents pour des cas concrets de production.
1. Création d'un Skill de calcul mathématique
Le premier pas est de définir une classe qui hérite de BaseSkill. Utilisez Pydantic pour valider les types d'entrée. Cela évite les erreurs de type TypeError lors de l'exécution par l'agent.
class MathSkill(BaseSkill):
async def execute(self, payload: Dict[str, Any]) -> float:
# Calcul simple pour l'exemple
return float(payload.get("a", 0) + payload.get("b", 0))
@property
def metadata(self):
return {"version": "1.0.0", "type": "math"}
2. Implémentation d'un test de régression
Ne vous contentez pas de vérifier la valeur. Mesurez le temps de réponse. Un skill qui devient trop lent (dégradation de la latence) est aussi critique qu'un skill qui renvoie une mauvaise réponse.
# Cas de test pour le MathSkill
test_cases = [
SkillSchema(input_data={"a": 1, "b": 2}, expected_output=3.0),
SkillSchema(input_data={"a": 10, "b": 20}, expected_output=30.0)
]
3. Automatisation via la CLI
Une fois vos tests écrits, utilisez la commande sivchari run --skill MathSkill --tests tests.py. Le framework génère un rapport JSON. Ce fichier peut être injecté dans votre pipeline CI/CD (GitHub Actions ou GitLab CI) pour bloquer tout déploiement de skill non conforme.
Pour les agents utilisant des outils externes (API), utilisez unittest.mock pour simuler les réponses réseau. Cela permet de tester la logique de décision du skill sans consommer de tokens LLM ou de quota API.
▶️ Exemple d'utilisation
Exécution d'un test de validation sur un skill mathématique.
import asyncio
from my_skills import MathSkill, SkillSchema, SkillEvaluator
async def main():
skill = MathSkill()
evaluator = SkillEvaluator(skill)
tests = [
SkillSchema(input_data={"a": 5, "b": 5}, expected_output=10.0),
SkillSchema(input_data={"a": 0, "b": 0}, expected_output=0.0)
]
results = await evaluator.run_test_suite(tests)
print(results)
if __name__ == "__main__":
asyncio.run(main())
# Sortie attendue
[{'success': True, 'latency': 0.00012, 'error': None}, {'success': True, 'latency': 0.00009, 'error': None}]
🚀 Cas d'usage avancés
Intégration avec des outils de monitoring : Vous pouvez envoyer les résultats de SkillEvaluator vers Prometheus ou InfluxDB. Cela permet de créer des alertes sur la dérive de performance (drift detection) des capacités de vos agents.
A/B Testing de modèles : Utilisez sivchari pour agents pour comparer deux versions d'un même skill utilisant GPT-4o et Claude 3.5 Sonnet. Comparez le ratio success/latency pour décider du modèle le plus rentable.
Validation de Schéma Dynamique : Pour des skills qui génèrent du JSON, utilisez le module jsonschema à l'intérieur de la méthode execute pour valider que la sortie respecte strictement le contrat défini dans SkillSchema.
🐛 Erreurs courantes
⚠️ Non-déterminisme des LLM
Vérifier l'égalité exacte (==) sur une chaîne de caractères générée par un LLM échouera souvent à cause des espaces ou de la casse.
assert output == "Le résultat est 10"
assert semantic_similarity(output, "Le résultat est 10") > 0.9
⚠️ Oubli de l'asynchronisme
Appeler un skill asynchrone sans await bloque l'exécution et renvoie un objet coroutine au lieu du résultat.
result = skill.execute(data)
result = await skill.execute(data)
⚠️ Fuite de mémoire dans les tests
Accumuler les objets de résultats dans une liste globale sans nettoyage lors de tests massifs.
class GlobalResults: results = []
class Evaluator: def __init__(self): self.results = []
⚠️ Type Hinting laxiste
Utiliser 'Any' partout empêche la détection d'erreurs par mypy avant l'exécution.
def process(data: Any):
def process(data: SkillSchema):
✅ Bonnes pratiques
Pour maintenir un projet sivchari pour agents de niveau production, suivez ces règles :
- Immuabilité : Les payloads d'entrée ne doivent jamais être modifiés par le skill. Utilisez des
FrozenSetou des objetsPydanticen modefrozen=True. - Isolation : Chaque skill doit être testable sans dépendances réseau réelles via l'injection de dépendances.
- Versionnage : Incluez toujours un numéro de version dans les métadonnées du skill pour permettre le rollback.
- Observabilité : Loggez chaque échec de test avec le payload d'entrée complet pour faciliter le debugging.
- Typage strict : Utilisez
pyrightoumypyen mode strict dans votre pipeline CI pour valider les contrats d'interface.
- sivchari pour agents transforme les capacités d'IA en composants testables.
- Utilisation de l'asynchronisme (asyncio) pour une évaluation haute performance.
- Le contrat d'interface est défini par des schémas Pydantic.
- Mesure systématique de la latence et de la précision.
- Intégration native dans les pipelines CI/CD.
- Détection des régressions lors de l'ajout de nouveaux skills.
- Approche par 'Contract Testing' pour les agents LLM.
- Éviter l'égalité stricque sur les sorties textuelles non-déterministes.
❓ Questions fréquentes
Puis-je utiliser sivchari avec LangGraph ?
Oui. Sivchari intervient en amont pour valider les nœuds (nodes) qui agissent comme des skills.
Comment gérer les erreurs d'API dans mes tests ?
Utilisez des mocks ou des 'VCR.py' pour enregistrer les interactions HTTP et les rejouer de manière déterministe.
Le framework supporte-t-il le multithreading ?
Il repose sur l'event loop asyncio, ce qui est plus efficace que le multithreading pour les tâches I/O bound.
Quelle est la limite de performance ?
La limite est principalement la latence de l'LLM lui-même, pas le framework de test.
📚 Sur le même blog
🔗 Le même sujet sur nos autres blogs
📝 Conclusion
Le framework sivchari pour agents apporte la rigueur nécessaire au passage des prototypes d'agents vers la production. En traitant chaque capacité comme une unité logicielle vérifiable, on réduit drastiquement l'entropie logicielle liée aux modèles non-déterministes. Pour approfondir la gestion des types en Python, consultez la documentation Python officielle. Un agent sans tests est une dette technique en devenir.