Skip to main content

Moteur de workflow LLM basé sur des graphes d'agents

Project description

llm-wf

Moteur de workflow LLM basé sur des graphes d'agents. Permet d'enchaîner des agents LLM connectés par leurs variables, avec parallélisation automatique des agents indépendants.

Principe

Un workflow est un graphe orienté acyclique (DAG) d'agents LLM. Chaque agent :

  • reçoit des variables d'entrée injectées dans son prompt (template Jinja2) ;
  • appelle un service LLM ;
  • produit une ou plusieurs variables de sortie.

Les connexions entre agents sont déduites automatiquement : si l'agent A produit résumé et que l'agent B consomme résumé, l'arête A → B est créée. Les agents sans dépendance commune s'exécutent en parallèle.

entrée: document
    │
    ▼
[agent_résumé]  ──────────────────────────────────┐
    │ résumé                                       │
    ▼                                              ▼
[agent_mots_clés]                        [agent_sentiment]
    │ mots_clés                                    │ sentiment
    └──────────────────────┬───────────────────────┘
                           ▼
                    [agent_rapport]
                           │ rapport_final
                           ▼
                         sortie

Installation

pip install llm-wf

Ou en mode développement :

pip install -e .  # développement local

Usage CLI

llmwf -w workflow.yaml -v document="Mon texte à analyser"
llmwf -w workflow.yaml -f document=rapport.pdf --verbose
llmwf -w workflow.yaml -f doc=rapport.txt -v langue=français -o md
llmwf -w workflow.yaml --graph                  # diagramme seul
llmwf -w workflow.yaml --graph -f doc=texte.txt # diagramme + exécution

Options

Option Description
-w, --workflow Fichier YAML du workflow (requis)
-v var=valeur Variable directe (répétable)
-f var=fichier Variable chargée depuis un fichier .txt, .md ou .pdf (répétable)
-o text|md|html Format de sortie (défaut : text)
-g [fichier], --graph [fichier] Génère le diagramme PlantUML du workflow (voir ci-dessous)
--verbose Affiche le détail de l'exécution
--version Affiche la version

Génération de diagramme PlantUML

L'option -g/--graph produit une représentation visuelle du graphe d'agents au format PlantUML.

llmwf -w workflow.yaml --graph              # → <Nom_du_workflow>.puml
llmwf -w workflow.yaml --graph mon_flow.puml  # → mon_flow.puml

Le rendu en image (PNG) est tenté automatiquement selon la disponibilité :

  1. Binaire local plantuml — rendu local si installé
  2. Serveur public plantuml.com — via le package Python plantuml si le réseau est accessible
  3. Fichier .puml seul — si aucune option de rendu n'est disponible

Utilisé sans variables d'entrée (-v/-f), le diagramme est généré puis la commande se termine (pas d'exécution du workflow).

Format du fichier workflow YAML

name: "Analyse de document"
system_prompt: prompts/system.md

agents:
  - id: résumé
    prompt: prompts/resume.md
    service: ollama
    model: gemma3:4b
    inputs: [document]
    outputs: [résumé]

  - id: mots_clés
    prompt: prompts/mots_cles.md
    service: anthropic
    model: claude-haiku-4-5-20251001
    api_key: "None"          # utilise QCANTHROPIC_API_KEY
    inputs: [résumé]
    outputs: [mots_clés]

  - id: rapport
    prompt: prompts/rapport.md
    service: ollama
    model: gemma3:4b
    inputs: [résumé, mots_clés]
    outputs: [rapport_final]

Champs d'un agent

Champ Requis Description
id oui Identifiant unique de l'agent
prompt oui Chemin vers le fichier de prompt (relatif au YAML)
service oui Service LLM (voir ci-dessous)
model oui Nom du modèle
inputs non Variables d'entrée consommées
outputs oui Variables de sortie produites
url non URL personnalisée du service
api_key non Clé API (sinon variable d'environnement)

Sorties multiples

Si un agent déclare plusieurs outputs, son prompt doit retourner un objet JSON :

{"var1": "valeur1", "var2": "valeur2"}

Le moteur extrait automatiquement un bloc ```json ``` ou le premier objet JSON nu dans la réponse.

Services LLM supportés

service Description Variable d'env.
ollama Ollama local (localhost:11434) ou distant si url fourni
ollama_cloud Ollama Cloud OLLAMA_API_KEY
lms LM Studio (local)
openai OpenAI API OPENAI_API_KEY
anthropic Anthropic Claude QCANTHROPIC_API_KEY
google Google Gemini GEMINI_API_KEY
albert Albert (DINUM — service public) ALBERT_API_KEY
ragarenn Ragarenn (Eskemm Numérique) RAG_API_KEY
poe POE API POE_API_KEY
generic API compatible OpenAI (nécessite url et api_key)

Format des prompts

Les prompts sont des templates Jinja2. Les variables d'entrée déclarées dans inputs sont injectées automatiquement.

Voici le document à résumer :

{{ document }}

Produis un résumé en 3 phrases maximum.

Les caractères spéciaux Markdown et les balises Jinja2 présents dans les variables sont échappés automatiquement pour éviter les injections de prompt.

Usage programmatique

from llm_workflow import WorkflowConfig, WorkflowGraph, WorkflowExecutor

config = WorkflowConfig.from_yaml("workflow.yaml")
graph = WorkflowGraph.from_agents(config.agents)

errors = graph.validate({"document": "Mon texte..."})
if errors:
    raise ValueError(errors)

executor = WorkflowExecutor(graph, config.load_system_prompt(), verbose=True)
results = executor.execute({"document": "Mon texte..."})
print(results["rapport_final"])

Variables d'environnement

export OPENAI_API_KEY="sk-..."
export QCANTHROPIC_API_KEY="sk-ant-..."
export GEMINI_API_KEY="AIza..."
export ALBERT_API_KEY="..."
export RAG_API_KEY="..."
export OLLAMA_API_KEY="..."
export POE_API_KEY="..."

Exemple complet

Le répertoire examples/analyse_document/ contient un workflow fonctionnel à 4 agents (résumé → mots-clés + sentiment en parallèle → rapport).

Prérequis : Ollama installé et démarré avec le modèle gemma3:4b.

# Avec un texte direct
llmwf -w examples/analyse_document/workflow.yaml \
       -v document="L'intelligence artificielle transforme profondément nos sociétés." \
       --verbose

# Avec un fichier texte
llmwf -w examples/analyse_document/workflow.yaml \
       -f document=mon_document.txt \
       -o md

Prérequis

  • Python ≥ 3.11
  • Dépendances : voir requirements.txt

Auteur

Emmanuel Desmontils — emmanuel.desmontils@univ-nantes.fr

avec l'aide de Claude Code et POE/Sonnet-4.6

Licence

CeCILL-B — Licence libre française élaborée par le CEA, le CNRS et l'INRIA, compatible avec le droit français. Permet la réutilisation et la modification libres sous condition d'attribution.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

llm_wf-0.1.2.tar.gz (25.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

llm_wf-0.1.2-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

Details for the file llm_wf-0.1.2.tar.gz.

File metadata

  • Download URL: llm_wf-0.1.2.tar.gz
  • Upload date:
  • Size: 25.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.4

File hashes

Hashes for llm_wf-0.1.2.tar.gz
Algorithm Hash digest
SHA256 abf5cea14a0531098353ec32747ddb8c3076765cdfaa78264bd304163712f841
MD5 871e79487b8b9f2c6180a0af74d14ae3
BLAKE2b-256 3db8457b5c8bf627e1d2030dc837fcb3f52fffb9544a6cefe6c9e467cadc3df6

See more details on using hashes here.

File details

Details for the file llm_wf-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: llm_wf-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 28.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.4

File hashes

Hashes for llm_wf-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ca27e448d8cd0c1d3567ed46137715fb58213867637b3f979f7326dfd7f91b66
MD5 df072e4b4a4138acc6d7080ad90ce51e
BLAKE2b-256 6b4609b5c0b4be381120de0d3703fa862034e09977e23957086e10398992f574

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page