before_model() — langchain Function Reference
Architecture documentation for the before_model() function in pii.py from the langchain codebase.
Entity Profile
Dependency Diagram
graph TD e81931fa_c61c_8dac_e9d4_8b63fbff471d["before_model()"] dc527b75_da40_4d1c_e472_82d1252ba70b["PIIMiddleware"] e81931fa_c61c_8dac_e9d4_8b63fbff471d -->|defined in| dc527b75_da40_4d1c_e472_82d1252ba70b 9c796f5d_d259_f87b_dbac_56cc6e575e35["abefore_model()"] 9c796f5d_d259_f87b_dbac_56cc6e575e35 -->|calls| e81931fa_c61c_8dac_e9d4_8b63fbff471d ffe55823_7c55_8b73_2be6_a2b281bb64cf["_process_content()"] e81931fa_c61c_8dac_e9d4_8b63fbff471d -->|calls| ffe55823_7c55_8b73_2be6_a2b281bb64cf style e81931fa_c61c_8dac_e9d4_8b63fbff471d fill:#6366f1,stroke:#818cf8,color:#fff
Relationship Graph
Source Code
libs/langchain_v1/langchain/agents/middleware/pii.py lines 171–263
def before_model(
self,
state: AgentState[Any],
runtime: Runtime[ContextT],
) -> dict[str, Any] | None:
"""Check user messages and tool results for PII before model invocation.
Args:
state: The current agent state.
runtime: The langgraph runtime.
Returns:
Updated state with PII handled according to strategy, or `None` if no PII
detected.
Raises:
PIIDetectionError: If PII is detected and strategy is `'block'`.
"""
if not self.apply_to_input and not self.apply_to_tool_results:
return None
messages = state["messages"]
if not messages:
return None
new_messages = list(messages)
any_modified = False
# Check user input if enabled
if self.apply_to_input:
# Get last user message
last_user_msg = None
last_user_idx = None
for i in range(len(messages) - 1, -1, -1):
if isinstance(messages[i], HumanMessage):
last_user_msg = messages[i]
last_user_idx = i
break
if last_user_idx is not None and last_user_msg and last_user_msg.content:
# Detect PII in message content
content = str(last_user_msg.content)
new_content, matches = self._process_content(content)
if matches:
updated_message: AnyMessage = HumanMessage(
content=new_content,
id=last_user_msg.id,
name=last_user_msg.name,
)
new_messages[last_user_idx] = updated_message
any_modified = True
# Check tool results if enabled
if self.apply_to_tool_results:
# Find the last AIMessage, then process all `ToolMessage` objects after it
last_ai_idx = None
for i in range(len(messages) - 1, -1, -1):
if isinstance(messages[i], AIMessage):
last_ai_idx = i
break
if last_ai_idx is not None:
# Get all tool messages after the last AI message
for i in range(last_ai_idx + 1, len(messages)):
msg = messages[i]
if isinstance(msg, ToolMessage):
tool_msg = msg
if not tool_msg.content:
continue
content = str(tool_msg.content)
new_content, matches = self._process_content(content)
if not matches:
continue
# Create updated tool message
updated_message = ToolMessage(
content=new_content,
Domain
Subdomains
Calls
Called By
Source
Frequently Asked Questions
What does before_model() do?
before_model() is a function in the langchain codebase, defined in libs/langchain_v1/langchain/agents/middleware/pii.py.
Where is before_model() defined?
before_model() is defined in libs/langchain_v1/langchain/agents/middleware/pii.py at line 171.
What does before_model() call?
before_model() calls 1 function(s): _process_content.
What calls before_model()?
before_model() is called by 1 function(s): abefore_model.
Analyze Your Own Codebase
Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.
Try Supermodel Free