custom_tool#

langchain_openai.tools.custom_tool.custom_tool(
*args: Any,
**kwargs: Any,
) Any[source]#

Decorator to create an OpenAI custom tool.

Custom tools allow for tools with (potentially long) freeform string inputs.

See below for an example using LangGraph:

@custom_tool
def execute_code(code: str) -> str:
    """Execute python code."""
    return "27"


llm = ChatOpenAI(model="gpt-5", output_version="responses/v1")

agent = create_react_agent(llm, [execute_code])

input_message = {"role": "user", "content": "Use the tool to calculate 3^3."}
for step in agent.stream(
    {"messages": [input_message]},
    stream_mode="values",
):
    step["messages"][-1].pretty_print()

You can also specify a format for a corresponding context-free grammar using the format kwarg:

from langchain_openai import ChatOpenAI, custom_tool
from langgraph.prebuilt import create_react_agent

grammar = """
start: expr
expr: term (SP ADD SP term)* -> add
| term
term: factor (SP MUL SP factor)* -> mul
| factor
factor: INT
SP: " "
ADD: "+"
MUL: "*"
%import common.INT
"""

format = {"type": "grammar", "syntax": "lark", "definition": grammar}

# highlight-next-line
@custom_tool(format=format)
def do_math(input_string: str) -> str:
    """Do a mathematical operation."""
    return "27"


llm = ChatOpenAI(model="gpt-5", output_version="responses/v1")

agent = create_react_agent(llm, [do_math])

input_message = {"role": "user", "content": "Use the tool to calculate 3^3."}
for step in agent.stream(
    {"messages": [input_message]},
    stream_mode="values",
):
    step["messages"][-1].pretty_print()
Parameters:
  • args (Any)

  • kwargs (Any)

Return type:

Any