Notes pratiques : De le schéma au pipeline : mise en œuvre du Agentic Cortex avec
Guide pratique pas à pas : Des modèles aux pipelines : Mise en œuvre de l’Agentic Cortex avec des contrats, des vérifications et des emplacements de code prêts à l’emploi pour les équipes qui utilisent ce modèle.
Sources: From Pattern to Pipeline: Implementing the Agentic Cortex with LangGraph and OPA
Les notes suivantes reconstituent un parcours pratique autour du sujet « De le schéma au pipeline : mise en œuvre de l’Agentic Cortex avec LangGraph et OPA ». L’accent est mis sur les contrats, les vérifications et les placeholders de code à insérer, plutôt que sur une présentation motivante. Lors de la phase d’aperçu, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Documentez ensemble le parcours normal et le parcours de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages non livrés font partie du produit, et non d’une finition ultérieure.
Aperçu de l’architecture :
La phase d’aperçu de l’architecture fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit pointer vers une seule responsabilité plutôt que vers un processus enchevêtré. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.
Le pipeline : six nœuds, un StateGraph
La phase des Six Nœuds du Pipeline fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définez des vérifications de succès, et refusez toute complétion partielle silencieuse. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.
class CortexState(TypedDict, total=False):
domain_outputs: Dict[str, DomainOutput]
normalized_recommendations: List[NormalizedRecommendation]
cross_domain_conflicts: List[CrossDomainConflict]
policy_decisions: List[PolicyDecision]
resolved_conflicts: List[CrossDomainConflict]
sentinel_check: Optional[SentinelCheckResult]
final_recommendations: List[NormalizedRecommendation]
workflow = SateGraph(CortexState)
workflow.add_node("collect_domains", domain_collector_agent)
workflow.add_node("evaluate_mesh", mesh_evaluator_agent)
workflow.add_node("apply_policies", policy_engine_agent)
workflow.add_node("resolve_conflicts", conflict_resolver_agent)
workflow.add_node("sentinel_check", sentinel_loop_agent)
workflow.add_node("generate_report", report_generator_agent)workflow.set_entry_point("collect_domains")
workflow.add_conditional_edges("collect_domains",
should_continue_after_collection,
{"evaluate_mesh": "evaluate_mesh", "end": END})
Nœud 1 : Le Collecteur de Domaines
La phase Node 1 The Domain fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Notez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de l’environnement de démonstration aux environnements partagés. Gardez l’état du graphe plat et typé ; les blocs imbriqués masquent l’identité du nœud qui a écrit chaque champ et perturbent la reprise après interruption. La phase Node 1 The Domain fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un enregistrement idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives de réessai, les contrôles humains et le traitement des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.
AGENT_A_URL = "http://localhost:8001"
AGENT_B_URL = "http://localhost:8002"
Node 2 : L’évaluateur de réseau, où apparaissent les conflits
Pour l’étape Mesh de Node 2, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Faites approuver par des humains les actions qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier.
{
"conflict_type": "budget_reliability_tradeoff",
"severity": "HIGH",
"resource_id": "resource-x",
"recommendation_a": {"domain": "domain_a",
"title": "Decommission idle resource-x"},
"recommendation_b": {"domain": "domain_b",
"title": "Enable redundancy for resource-x"}
}
Score Mesh = (Confiance × 100) + Bonus de gravité — Pénalités pour conflits
Pour l’étape Mesh Score Confidence X, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Nommez les artefacts, définissez des vérifications de succès et refusez toute exécution partielle silencieuse. Faites approuver par un humain les actions qui entraînent des dépenses ou modifient des données de production. Une connexion en temps de compilation ne garantit pas la complétude du processus métier.
Nœud 3 : Le moteur de politiques OPA, gouvernance déterministe
Pour l’étape OPA du Nœud 3, définissez les entrées, le responsable de l’étape et les critères de sortie avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le parcours passe de l’environnement de démonstration à des environnements partagés. Imposez une approbation humaine pour les actions qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier. Pour l’étape OPA du Nœud 3, définissez les entrées, le responsable de l’étape et les critères de sortie avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez conjointement le parcours normal et le parcours de récupération. Les tentatives de réexécution, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.
Architecture Sidecar d’OPA
Lors de la phase d’architecture Sidecar d’OPA, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Faites un point après les étapes coûteuses. Le mécanisme de reprise ne doit pas facturer à nouveau la même appel d’LLM lorsque l’opérateur réessaie un nœud ultérieur.
package cortex.recommendation
decision := result if {
_is_destructive_action(input.recommendation.title)
_is_critical_resource(input.recommendation.resource_id,
input.context)
result := {
"decision": "deny",
"reason": "Policy prevents decommissioning
of critical resource",
"rule_name": "protect_critical_resources"
}
}
package cortex.conflict
# Budget vs Reliability on critical resources gets policy override
resolution := result if {
input.conflict.conflict_type == "budget_reliability_tradeoff"
_is_critical_resource(input.conflict.resource_id, input.context)
result := {
"strategy": "policy_override",
"winner": _higher_ranked_domain(...),
"rule_name": "budget_reliability_critical_resource"
}
}# Resource Contention resolved by domain priority for unequal ranks
resolution := result if {
input.conflict.conflict_type == "resource_contention"
domain_rank[...] != domain_rank[...]
result := {
"strategy": "domain_priority",
"winner": _higher_ranked_domain(...),
"rule_name": "resource_contention_priority"
}
}# Opposing Recommendations on critical resources are escalated
resolution := result if {
input.conflict.conflict_type == "opposing_recommendations"
_is_critical_resource(...)
result := {
"strategy": "escalate",
"winner": "none",
"rule_name": "opposing_critical_escalate"
}
}
package cortex.priority
domain_rank := {
"domain_a": 1,
"domain_b": 2,
"domain_c": 3,
"domain_d": 4,
"domain_e": 5
}
services:
opa:
image: openpolicyagent/opa:latest
command: run --server --addr=0.0.0.0:8181 /policies
volumes:
- ./src/policies:/policies
Nœud 4 : Le résolveur de conflits, résolution en quatre étapes
Lors de l’étape Node 4 Le Conflit, notez d’abord le contrat : les entrées requises, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès, et refusez les terminations partielles silencieuses. Faites un point après des étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel d’LLM lorsque l’opérateur réessaie une étape ultérieure.
Hierarchie des quatre étapes de résolution des conflits
Lors de la mise en œuvre de l’étape de résolution des conflits en quatre étapes, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle garantit l’honnêteté des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des jetons ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de l’environnement de démonstration aux environnements partagés. Faites un point après les étapes coûteuses. La reprise du processus ne doit pas facturer à nouveau la même appel de LLM lorsque l’opérateur réessaie un nœud ultérieur. Lors de la mise en œuvre de l’étape de résolution des conflits en quatre étapes, notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle garantit l’honnêteté des modifications ultérieures du code. Documentez ensemble le parcours optimal et le parcours de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations ultérieures.
{
"winner": "a" | "b" | "both",
"reasoning": "...",
"confidence": 0.0-1.0
}
Nœud 5 : La boucle Sentinel, détection des écarts entre cycles
La phase Sentinel du Nœud 5 fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript d’exemple, un cas de défaillance et la note de réversion avant d’élargir le périmètre. Préférez des unités petites et testables à des scripts complexes. Lorsqu’une étape échoue, la défaillance doit pointer vers une seule responsabilité plutôt que vers un processus embrouillé. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.
change_percent = (current - previous) / abs(previous) * 100
if abs(change_percent) > DRIFT_THRESHOLD_PERCENT:
drift_status = "WORSENED" if change_percent < 0
else "DRIFTED"
Nœud 6 : Le générateur de rapports
La phase « Node 6 The Report » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Considérez cette phase comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès et refusez toute complétion partielle silencieuse. Maintenez l’état du graphe plat et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.
Le scénario de démonstration complet
La phase « The Full Demo Scenario » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le processus passe de la démonstration aux environnements partagés. Gardez l’état des graphes simple et bien typé ; les blocs imbriqués masquent l’identité du nœud qui a écrit tel champ et perturbent la reprise après interruption. La phase « The Full Demo Scenario » fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de réversion avant d’élargir le périmètre. Documentez ensemble le parcours réussi et le parcours de récupération. Les tentatives de réessai, les contrôles humains et le traitement des messages non livrés font partie intégrante du produit, et non d’une mise en forme ultérieure.
Lancer le processus
Pour l’étape « Running It », définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Préférez des unités petites et testables aux scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité plutôt qu’un processus embrouillé. Faites approuver par des humains les actions qui entraînent des dépenses ou modifient des données de production. La connexion en temps de compilation ne garantit pas la complétude du processus métier.
git clone https://github.com/kyndryl-cto/agentic-cortex.git
cp .env.example .env
# Fill in Azure OpenAI credentials
docker-compose up
curl -X POST http://localhost:8000/assess \
-H "Content-Type: application/json" \
-d '{"subscription_ids": ["sub-001"],
"tenant_id": "tenant-001"}'
{
"node": "evaluate_mesh", "status": "processing",
"agent": "mesh_evaluator", "timestamp": "..."
}
{
"node": "apply_policies", "status": "processing",
"agent": "policy_engine", "timestamp": "..."
}
Échelle vers la production : ajouter des domaines sans toucher au pipeline
Pour l’étape de passage à la production, définissez les entrées, le responsable de cette étape ainsi que les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu, sans avoir à deviner l’état caché. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définites des vérifications de succès et refusez toute finalisation partielle silencieuse. Faites approuver par un humain les cas où de l’argent est dépensé ou où des données de production sont modifiées. Une configuration en temps de compilation ne garantit pas la complétude des opérations métier.
Rédaction de politiques Rego personnalisées pour une gouvernance spécifique à l’organisation
Pendant l’étape d’écriture de politiques Rego personnalisées, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite les factures inattendues lorsque le parcours passe de l’environnement de démonstration à des environnements partagés. Mettez en place une approbation humaine pour les cas où de l’argent est dépensé ou des données de production sont modifiées. La connexion en temps de compilation ne garantit pas la complétude du processus métier. Pendant l’étape d’écriture de politiques Rego personnalisées, définissez les entrées, le responsable de l’étape et les critères d’arrêt avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché. Documentez conjointement le parcours idéal et le parcours de récupération. Les tentatives de réexécution, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations ultérieures.
decision := result if {
"database" in lower(input.recommendation.resource_type)
_is_destructive_action(input.recommendation.title)
not _has_recovery_plan(input.recommendation.resource_id,
input.context)
result := {
"decision": "deny",
"reason": "Cannot decommission database without
verified recovery plan",
"rule_name": "protect_databases"
}
}
decision := result if {
input.recommendation.estimated_savings > 10000
result := {
"decision": "escalate",
"reason": sprintf("Projected savings $%.0f exceeds
threshold and requires approval",
[input.recommendation.estimated_savings]),
"rule_name": "high_impact_approval"
}
}
Mettre en œuvre le cycle Sentinel avec la surveillance cloud
Lors de l’étape de mise en œuvre du cycle Sentinel, notez d’abord les exigences : entrées requises, signal de succès et conséquences en cas d’échec partiel. Cette liste de contrôle permet de rester honnête lors des modifications ultérieures du code. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit indiquer une seule responsabilité et non un processus embrouillé. Créez des points de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel d’LLM lorsque l’opérateur réessaie un nœud ultérieur.
Intégration du cycle Sentinel et de la surveillance cloud
Lorsque vous travaillez sur l’étape Sentinel Loop et Cloud, notez d’abord le contrat : les entrées requises, le signal de succès, ainsi que ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’honnêteté des modifications ultérieures du code. Considérez cette étape comme un contrat entre les entrées et les sorties validées. Donnez des noms aux artefacts, définez des vérifications de succès, et refusez toute exécution partielle silencieuse. Faites des points de contrôle après les étapes coûteuses. Le système de reprise ne doit pas facturer à nouveau la même appel du LLM lorsque l’opérateur réessaie un nœud ultérieur.
Observabilité : Suivre le parcours complet de résolution
Lors du travail sur l’étape « Observability Tracing the Full », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Enregistrez les temps d’exécution ainsi que le coût des tokens ou des requêtes à côté des résultats fonctionnels. Une visibilité précoce des coûts évite des factures inattendues lorsque le parcours passe de l’environnement de démonstration à des environnements partagés. Créez un point de contrôle après les étapes coûteuses. La reprise du processus ne doit pas facturer à nouveau la même appel de LLM lorsque l’opérateur réessaie un nœud ultérieur. Lors du travail sur l’étape « Observability Tracing the Full », notez d’abord le contrat : les entrées requises, le signal de succès et ce qui se passe en cas d’échec partiel. Cette liste de contrôle permet de garantir l’intégrité des modifications ultérieures du code. Documentez ensemble le parcours normal et le parcours de récupération. Les tentatives de réessai, les contrôles humains et la gestion des messages non livrés font partie intégrante du produit, et non d’améliorations ultérieures.
{
"decision_id": "pd-001",
"recommendation_id": "rec-001",
"policy_name": "protect_critical_resources",
"result": "deny",
"reason": "Policy prevents decommissioning
of critical resource",
"evaluated_at": "2026-03-12T14:23:01Z"
}
{
"conflict_id": "cf-001",
"resolution_strategy": "POLICY_OVERRIDE",
"resolved_by": "policy",
"resolution_outcome": "Resolved by policy:
'protect_critical_resources'
denied 'Decommission idle resource-x'"
}
Résumé architectural
La phase de résumé architectural fonctionne le mieux lorsqu’elle est considérée comme une surface mesurable. Capturez un transcript idéal, un cas d’échec et la note de rollback avant d’élargir le périmètre. Préférez des unités petites et testables plutôt que des scripts complexes. Lorsqu’une étape échoue, l’échec doit pointer vers une seule responsabilité et non vers un processus embrouillé. Maintenez l’état des graphes simple et typé. Les blocs imbriqués masquent le fait que tel nœud a écrit telle champ et perturbent la reprise après interruption.
Liste de contrôle opérationnelle
Pour la phase de liste de contrôle opérationnelle, définissez les entrées, le responsable de l’étape et les critères de fin avant de modifier le code. Les opérateurs doivent pouvoir relancer l’étape à partir d’un point de contrôle connu sans deviner l’état caché.
Gardez la configuration en dehors du code de l’application. Les fichiers d’environnement, les bases de données secrètes et les indicateurs fonctionnels doivent être regroupés en un seul endroit que les opérateurs peuvent auditer sans devoir lire l’ensemble du système.
Faites approuver par un humain les étapes qui entraînent des dépenses ou modifient des données en production. Une connexion configurée au moment de la compilation ne garantit pas une couverture complète des besoins métier.
Rédigez un guide de fonctionnement succinct : comment rotationner les clés, vider la file d’attente, annuler la dernière ingestion.
Dokumentez à la fois le parcours normal et celui de récupération. Les tentatives répétées, les contrôles humains et la gestion des messages échoués font partie intégrante du produit, et non d’une amélioration ultérieure.
Faites approuver par un humain les étapes qui entraînent des dépenses ou modifient des données en production. Une connexion configurée au moment de la compilation ne garantit pas une couverture complète des besoins métier.
Au préalable de promouvoir le stack, figez les versions, conservez une transcription « or » pour le chemin critique, et confirmez les étapes de rollback. Les environnements partagés nécessitent des limites de débit, des vérifications de location, ainsi qu’un responsable clair pour la rotation des secrets. Préférez une fiabilité solide à des démonstrations brillantes mais ponctuelles.
Note de batch pour 90ddb9951707 : gardez les clés du fournisseur hors du repo, fixez un plafond pour les tokens par session, et stockez les transcriptions à côté des fichiers d’évaluation afin que les remplacements ultérieurs de modèles restent comparables.