Aller au contenu principal
INTÉGRATION FRAMEWORK • LANGCHAIN & LANGGRAPH

SDK LangChain & LangGraph

CallbackHandler natif sur on_tool_start, protection des ToolNodes dans LangGraph et traçabilité complète des graphes d'exécution.

SDK LangChain & LangGraph

Intégration LangChain & LangGraph

Le Sensor Boundry fournit une implémentation native de l'interface BaseCallbackHandler de LangChain. Cette approche permet de sécuriser l'ensemble des agents, outils et chaînes d'exécution sans modifier le code de vos outils existants.


1. Utilisation avec LangChain Agents​

Exemple Complet​

langchain_secure_agent.py
import os
from langchain_openai import ChatOpenAI
from langchain.agents import create_openai_tools_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.tools import tool
from boundry.sensor import BoundryCallbackHandler

# 1. Définir les outils métiers standards de votre agent
@tool
def cancel_subscription(subscription_id: str, reason: str) -> str:
"""Résilie un abonnement client actif."""
return f"Abonnement {subscription_id} résilié avec succès."

@tool
def issue_refund(customer_id: str, amount_cents: int) -> str:
"""Émet un remboursement financier vers le compte du client."""
return f"Remboursement de {amount_cents / 100}€ validé pour le client {customer_id}."

tools = [cancel_subscription, issue_refund]

# 2. Instancier le Callback Handler Boundry
boundry_handler = BoundryCallbackHandler(
api_key=os.getenv("BOUNDRY_API_KEY"),
agent_id="customer-support-v2",
raise_on_blocked=True, # Lève une exception si l'action est interdite
sanitize_inputs=True # Active le caviardage DLP en amont
)

# 3. Configurer le modèle LLM et le prompt
llm = ChatOpenAI(model="gpt-4o", temperature=0)
prompt = ChatPromptTemplate.from_messages([
("system", "Vous êtes un agent de support client professionnel. Exécutez les demandes avec rigueur."),
MessagesPlaceholder(variable_name="chat_history", optional=True),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad"),
])

# 4. Assembler l'agent
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(
agent=agent,
tools=tools,
verbose=True,
callbacks=[boundry_handler] # Injection du gardien SecOps
)

# 5. Exécuter une requête
try:
response = executor.invoke({"input": "Peux-tu rembourser 4900 centimes au client cus_99182 ?"})
print("Réponse :", response["output"])
except Exception as e:
print("Action interceptée :", e)

2. Intégration dans LangGraph (Graphes d'État)​

Dans les architectures multi-étapes LangGraph, le BoundryCallbackHandler se transmet simplement dans le dictionnaire config lors de l'invocation du graphe :

langgraph_integration.py
from langgraph.graph import StateGraph, START, END
from boundry.sensor import BoundryCallbackHandler

# Instancier le handler
boundry_handler = BoundryCallbackHandler(
api_key=os.getenv("BOUNDRY_API_KEY"),
agent_id="compliance-graph-prod"
)

# Définition du graphe...
workflow = StateGraph(...)
app = workflow.compile()

# Exécution avec transmission du callback à tous les sous-noeuds
config = {"callbacks": [boundry_handler]}
final_state = app.invoke(
{"messages": [("user", "Analyser les risques du contrat #841")]},
config=config
)

3. Options de Configuration du Handler​

ParamètreTypeValeur par défautDescription
api_keystrNone (lit BOUNDRY_API_KEY)Clé secrète de votre organisation (sk_org_...).
agent_idstrObligatoireIdentifiant logique unique de l'agent dans la console.
raise_on_blockedboolTrueSi True, lève PolicyViolationException. Si False, injecte un message de refus formatté dans le flux pour permettre au LLM de replanifier.
sanitize_inputsboolTrueApplique le filtre DLP localement avant transmission réseau.
frameworkstr"LangChain"Tag d'observabilité associé aux traces d'audit.

4. Mode Replanification Douce (raise_on_blocked=False)​

Lorsque vous désactivez raise_on_blocked, le Sensor n'interrompt pas brutalement l'exécution de l'agent en levant une exception. À la place, il renvoie un message d'erreur d'outil structuré :

[BOUNDRY_SECURITY_INTERCEPTION] L'exécution de l'outil 'issue_refund' a été
bloquée par le pare-feu de sécurité (Motif: Montant supérieur au plafond autorisé de 500€).
Veuillez demander confirmation à un responsable hiérarchique ou ajuster votre demande.

Le LLM peut alors lire ce retour et formuler une réponse courtoise à l'utilisateur sans crasher le serveur.