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ètre | Type | Valeur par défaut | Description |
|---|---|---|---|
api_key | str | None (lit BOUNDRY_API_KEY) | Clé secrète de votre organisation (sk_org_...). |
agent_id | str | Obligatoire | Identifiant logique unique de l'agent dans la console. |
raise_on_blocked | bool | True | Si True, lève PolicyViolationException. Si False, injecte un message de refus formatté dans le flux pour permettre au LLM de replanifier. |
sanitize_inputs | bool | True | Applique le filtre DLP localement avant transmission réseau. |
framework | str | "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.