Skip to main content

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

Project description

llm-workflow

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 .

Ou en mode développement :

pip install -e .

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.1.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.1-py3-none-any.whl (28.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: llm_wf-0.1.1.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.1.tar.gz
Algorithm Hash digest
SHA256 4a862b95c3dc274a206cb7d8984be719c41d3e236201b8f06a6dfe2f3678a505
MD5 cd0642820bdb2108e4b30766635007cd
BLAKE2b-256 c0a19d317faaa9c946b0c817c7a688e6eb6bfc41d4f3b405100dc027d8d20094

See more details on using hashes here.

File details

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

File metadata

  • Download URL: llm_wf-0.1.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 36f39b9c2dc8e188ebb98ef82731eb3aee4d78dbbe259eec405946c138142224
MD5 3eb875a5c81026d14045a28ff65d763f
BLAKE2b-256 db29a90bee9ce8e8bca0899b404e73d2668a73eb80b19bbb24b7e9c5e639f983

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