LangChain Integration
LangChain tools and a document loader for Plasmate, returning structured SOM instead of raw HTML. Output size and token use depend on the source page and model tokenizer.
Plasmate's SOM output compiles web pages into compact, structured representations that preserve interactive elements and content hierarchy. This integration provides LangChain-native tools for stateless fetching, persistent browsing, and batch document loading.
Interactive form controls include action-state cues such as [disabled],
[enabled], [required], [group="Billing"], [current="page"],
[controls="panel-id"], [haspopup="menu"], and [description="..."]
when Plasmate emits those SOM attrs. Agents should use those cues before
calling plasmate_click or plasmate_type.
For agent prompts that need a compact action menu, use the shared action-plan helpers before constructing messages:
from langchain_plasmate import (
action_target_index,
find_action_targets_by_action,
find_action_targets_by_role,
)
index = action_target_index(som, enabled_only=True)
buttons = find_action_targets_by_role(som, "button", enabled_only=True)
clicks = find_action_targets_by_action(som, "click", enabled_only=True)
Source: integrations/langchain/
Installation
pip install langchain-plasmate
Requires the plasmate binary on your PATH:
curl -fsSL https://plasmate.app/install.sh | sh
Quick Start
Fetch a page (stateless)
from langchain_plasmate import PlasmateFetchTool
fetch = PlasmateFetchTool()
result = fetch.invoke("https://news.ycombinator.com")
print(result)
Agent with browsing tools
from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_plasmate import get_plasmate_tools
tools = get_plasmate_tools()
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
("system", "You can browse the web using Plasmate tools."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_tool_calling_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools)
result = executor.invoke({
"input": "Go to Hacker News and tell me the top 3 stories"
})
print(result["output"])
Document loader
from langchain_plasmate import PlasmateSOMLoader
loader = PlasmateSOMLoader([
"https://example.com",
"https://news.ycombinator.com",
])
docs = loader.load()
for doc in docs:
print(f"{doc.metadata['title']} - {doc.metadata['element_count']} elements")
print(doc.page_content[:200])
print()
Available Tools
`PlasmateFetchTool`
Stateless page fetch. Each call creates a fresh connection, fetches the URL, and returns SOM text. Best for one-off page reads.
from langchain_plasmate import PlasmateFetchTool
fetch = PlasmateFetchTool()
result = fetch.invoke("https://example.com")
`PlasmateNavigateTool`
Opens a URL in a persistent browser session. Use with PlasmateClickTool and PlasmateTypeTool for multi-step browsing workflows.
from langchain_plasmate import get_plasmate_tools
tools = get_plasmate_tools()
navigate, click, type_tool, fetch = tools
`PlasmateClickTool`
Clicks an interactive element by its SOM element ID (e.g., e_a1b2c3d4e5f6). Requires an active session from PlasmateNavigateTool.
`PlasmateTypeTool`
Types text into a form input or textarea by SOM element ID. Takes element_id and text as input.
`get_plasmate_tools()`
Returns all four tools with a shared Plasmate client and browser session:
from langchain_plasmate import get_plasmate_tools
from plasmate import Plasmate
# Default client
tools = get_plasmate_tools()
# Custom client
client = Plasmate(binary="/path/to/plasmate", timeout=60)
tools = get_plasmate_tools(client=client)
PlasmateSOMLoader
Loads web pages as LangChain Document objects with SOM text as page_content.
PlasmateSOMLoader(
urls=["https://example.com"],
budget=2000, # optional token budget per page
javascript=True, # enable JS execution (default)
client=None, # optional Plasmate instance
)
Document metadata includes: url, title, lang, html_bytes, som_bytes, element_count, interactive_count, and optionally description, open_graph, json_ld.
Output size
SOM is designed to retain semantic regions and supported interactive elements
while removing scripts, styles, hidden elements, and layout-only markup. The
result is page-dependent. In the v0.5.1 observational snapshots, the median
serialized-byte ratio was 9.98x across 83 successful non-JavaScript inputs out
of 98 attempted and 9.32x across 82 successful JavaScript inputs out of 98
attempted. Those byte ratios are not universal token, cost, latency, or
task-success guarantees. Measure PlasmateSOMLoader and the alternative loader
on your own corpus and tokenizer.