Skip to content

Framework Adapters

One of Anvil’s key features is framework portability. A single tool can be used with LangChain, CrewAI, AutoGen, OpenAI Agents SDK, or standalone.

Each AI framework has its own tool interface:

FrameworkTool Interface
LangChainBaseTool with _run() method
CrewAIBaseTool with Pydantic models
AutoGenFunctionTool with type hints
OpenAI AgentsFunctionTool with JSON schema

Writing tools for each framework means duplicating code. Anvil solves this with automatic adapters.

from anvil import Anvil
anvil = Anvil()
# Create one tool
search = anvil.use_tool(
name="web_search",
intent="Search the web for information"
)
# Use it everywhere
lc_tool = search.to_langchain() # LangChain
crew_tool = search.to_crewai() # CrewAI
ag_tool = search.to_autogen() # AutoGen
oai_tool = search.to_openai_agents() # OpenAI Agents SDK

Every Anvil Tool object has these methods:

MethodReturnsFramework
to_langchain()BaseToolLangChain
to_crewai()BaseToolCrewAI
to_autogen()FunctionToolAutoGen
to_openai_agents()FunctionToolOpenAI Agents SDK

Adapters automatically convert:

  • Name → Tool name/function name
  • Intent → Description for the LLM
  • Inputs → Typed parameters (Pydantic, JSON Schema, etc.)
  • Execution → Wrapped run() call

Install the adapter for your framework:

Terminal window
# LangChain
pip install "anvil-agent[langchain]"
# CrewAI
pip install "anvil-agent[crewai]"
# AutoGen
pip install "anvil-agent[autogen]"
# OpenAI Agents SDK
pip install "anvil-agent[openai-agents]"
# All frameworks
pip install "anvil-agent[all-frameworks]"

Detailed integration guides for each framework:

All adapters support async execution:

# Sync
result = search.run(query="test")
# Async
result = await search.run_async(query="test")

Framework adapters inherit this capability where supported.

Adapters generate proper type annotations from your InputParam definitions:

from anvil import InputParam
tool = anvil.use_tool(
name="calculate",
intent="Perform calculation",
inputs=[
InputParam(name="x", param_type="float", required=True),
InputParam(name="y", param_type="float", required=True),
InputParam(name="operation", param_type="str", default="add"),
]
)
# LangChain adapter creates a Pydantic model:
# class CalculateInput(BaseModel):
# x: float
# y: float
# operation: str = "add"

If a framework isn’t installed, calling its adapter raises a helpful error:

tool.to_langchain()
# ImportError: LangChain is not installed.
# Install it with: pip install "anvil-agent[langchain]"