circuit neuronal / model-agnostic

CybNodes

On n'alourdit pas le cerveau par force brute. On l'entoure de circuits structurés et vérifiables, et on redit chaque résultat dans la voix de ton modèle.

$ pip install cybnodes

// c'est quoi

Une librairie Python, pas une boîte noire

pip install cybnodes, puis import cybnodes. Pas une app, pas un service à héberger : une brique que tu branches autour de ton propre modèle. Un LLM est génial pour parler, mauvais pour garantir. CybNodes met devant lui des réseaux qui répondent de façon exacte et vérifiable.

Librairie

Du Python pur, zéro dépendance obligatoire. Tu l'importes et tu composes.

Model-agnostic

Tu apportes ton LLM (ollama, API, local…). CybNodes apporte les circuits.

Vérifiable

Chaque réseau renvoie une réponse traçable : calcul exact, nœud de graphe, source web.

// pourquoi

Le savoir vit hors du modèle

Corriger un fait ne demande plus de ré-entraîner : tu édites un fichier.

Sans CybNodesAvec CybNodes
"47 × 38 ?" → le LLM tente, parfois fauxcalcul exact (AST sûr), toujours juste
"c'est quoi X ?" → le LLM hallucineréponse depuis ton graphe de connaissances
"quoi de neuf sur Y ?" → données périméesrecherche web, avec la source citée
corriger un fait → ré-entraîneréditer un fichier, zéro entraînement

// 60 secondes

Installer & démarrer

terminal
pip install cybnodes
# ou depuis les sources :
git clone https://github.com/Alex-Lou/cybnodes.git
cd cybnodes && pip install -e .
quickstart.py
# 1. Tu apportes TON modèle, n'importe quel callable
from cybnodes import CybNodes, Persona
from cybnodes.networks import CalculNetwork, SavoirNetwork

def my_llm(question, context):
    return call_my_model(question, context)  # -> str

# 2. Tu l'entoures de réseaux
cyb = CybNodes(
    conductor=my_llm,
    networks=[CalculNetwork(), SavoirNetwork(graph_path="graph.json")],
    persona=Persona(name="Aria", templates={"calcul": ["{value} ✦"]}),
)

# 3. Tu demandes
cyb.ask("47 x 38 ?")         # -> exact, jamais faux
cyb.ask("what is a cat?")    # -> depuis ton graphe, voix d'Aria
cyb.ask("write a haiku")     # -> aucun réseau -> ton modèle répond

// architecture

Les 5 couches

1
Le Conducteurton modèle, sa voix, sa personnalité
2
Le Routeuressaie les réseaux ; un réseau qui plante n'écroule rien
3
Les Réseauxune capacité chacun, indépendants (calcul, savoir, web…)
4
Le Tisseurredit le résultat brut dans la voix du conducteur
5
La Mémoirecapte des faits sûrs sur l'utilisateur, backend pluggable

// les réseaux livrés

Trois circuits, prêts à brancher

CalculNetwork

Calcul exact

Arithmétique sûre par AST (zéro eval). Symboles et mots ("fois", "puissance"…). Le LLM ne se trompe plus jamais sur un calcul.

SavoirNetwork

Savoir (GraphRAG)

Répond depuis un graphe de triplets sujet-relation-objet. Tu corriges une connaissance en éditant le graphe, sans ré-entraîner.

WebNetwork

Recherche web

Actualité via l'API Brave Search, avec la source citée. Honnête : "j'ai cherché et…". Se tait proprement sans clé.

// extensible

Écris ton réseau en 6 lignes

Hérite de Network, renvoie un Result quand tu sais, sinon None, et la main passe.

meteo.py
from cybnodes import Network, Result

class WeatherNetwork(Network):
    name = "weather"
    def match(self, question):
        if "weather" not in question.lower():
            return None            # pas mon rayon -> je rends la main
        data = weather_api(...)      # un résultat VÉRIFIABLE
        return Result(kind="weather", text=f"{data}°", source="weather-api")

cyb.add_network(WeatherNetwork())  # branché. C'est tout.

Utilise-le quand…

tu veux qu'un LLM réponde de façon exacte, vérifiable ou à jour sur certains sujets, tout en gardant sa voix, sans ré-entraîner.

Pas besoin quand…

c'est du pur génératif libre (écriture, brainstorming). Là, ton modèle seul suffit, CybNodes lui laisse simplement la main.