Tutorials Logic, IN info@tutorialslogic.com

LangChain Agents and Tools: Build Safe Tool-Calling Workflows

LangChain Agents and Tools

Agents let a model choose what action to take next. A tool can be a search function, calculator, database lookup, ticket creator, calendar API, or internal service. The agent reads the user request, chooses a tool, passes arguments, observes the result, and continues until it can answer.

Agents are powerful, but they are not the default answer. If your workflow is known, build a chain. Use agents when tool choice or step order is genuinely dynamic.

LangChain is expanded here with a practical explanation, multiple examples, and beginner-focused checks so the idea is easier to learn from this page alone.

Read the concept first, then trace the example line by line. The important habit is to connect the rule to visible behavior instead of memorizing only the name.

Mental Model

An agent is a loop around a model and a set of tools. The model decides which tool to call, and your code controls what tools are available.

Tool Design Principles

Good tools are narrow, typed, well-named, and safe. The model should not need to guess what a tool does. Dangerous tools should require confirmation or operate in read-only mode by default.

  • Use clear tool names and docstrings because the model reads them.
  • Validate tool arguments with schemas.
  • Separate read tools from write tools.
  • Add authorization checks outside the model.

Detailed Explanation of LangChain

LangChain becomes much easier when you separate the concept from the tool syntax. First identify the problem being solved, then identify the data or resource being changed, and finally identify the proof that the change worked.

In LangChain, this topic should be studied through prompt inputs, model calls, parser behavior, retrieved context, tool boundaries, and validation. Those points explain not only how to use the feature, but also why it fails when the wrong assumption is made.

The previous audit note was: under 650 content words; fewer than 2 sections . This expanded section adds a fuller explanation, concrete examples, and practice guidance so the page can stand on its own for beginners.

A good way to learn this page is to read the normal path once, run or trace the example, then intentionally change one input to observe the different result. That one change teaches more than memorizing several definitions.

  • Write the goal of LangChain before touching code or configuration.
  • Identify the normal case, edge case, and failure case.
  • Trace what changes before and after the operation.
  • Use a command, output, compiler message, log, metric, or table to verify the result.
  • Record the mistake that would confuse a beginner and the exact fix.

Beginner-Friendly Walkthrough for LangChain

Start with a tiny project scenario. For example, imagine one user action, one request, one resource, one function call, or one batch of data. Keep the scenario small enough that every step can be explained without skipping details.

Next, describe the movement of information. Where does the input start? Which rule or component handles it? What result should appear? If the result is wrong, where would you inspect first?

Finally, compare two outcomes. The correct outcome proves that you understand the main rule. The incorrect outcome teaches the symptom, which is what you will recognize later during debugging or interviews.

  • Normal path: valid input produces the expected result.
  • Boundary path: the smallest, largest, empty, or unusual input still behaves predictably.
  • Error path: a realistic mistake creates a visible symptom.
  • Fix path: one focused correction removes the symptom without changing unrelated code.

Tool-Calling Agent

This example exposes two safe tools. In production, tool functions should include logging, permissions, timeouts, and typed errors.

Tool-Calling Agent
from langchain_core.tools import tool
from langchain_openai import ChatOpenAI
from langgraph.prebuilt import create_react_agent

@tool
def calculate_monthly_cost(users: int, price_per_user: float) -> str:
    """Calculate monthly subscription cost for a number of users."""
    total = users * price_per_user
    return f"Monthly cost is ${total:.2f}"

@tool
def lookup_plan_limit(plan: str) -> str:
    """Return user limit for a plan. Valid plans: starter, growth, enterprise."""
    limits = {"starter": 5, "growth": 50, "enterprise": "custom"}
    return f"{plan} plan user limit: {limits.get(plan.lower(), 'unknown plan')}"

model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
agent = create_react_agent(model, tools=[calculate_monthly_cost, lookup_plan_limit])

result = agent.invoke({
    "messages": [
        ("user", "If we have 18 users on the growth plan at $12.50 each, what is the monthly cost and is it within the plan limit?")
    ]
})

print(result["messages"][-1].content)
  • The tool docstrings are part of the agent interface.
  • Use agents for dynamic tool selection, not for simple fixed calculations.
  • LangGraph is often used with LangChain for stateful agent workflows.

LangChain focused LangChain runnable example

LangChain focused LangChain runnable example
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template('Explain LangChain with one example and one warning.')
chain = prompt | (lambda message: message.text) | StrOutputParser()

# In a real app, replace the lambda with a chat model and keep the parser step explicit.

LangChain LangChain validation example

LangChain LangChain validation example
def check_answer(answer: str) -> list[str]:
    issues = []
    if 'source' not in answer.lower():
        issues.append('Add sources or retrieved context.')
    if len(answer) < 120:
        issues.append('Add a fuller explanation for LangChain.')
    return issues

print(check_answer('Short answer without source'))
Key Takeaways
  • Expose only the tools the agent needs for the current task.
  • Keep write actions behind confirmation or policy checks.
  • Log every tool call, arguments, result, and model step.
  • Explain the purpose of LangChain in your own words.
  • Run or trace a small LangChain example for LangChain.
  • Test a normal case, a boundary case, and a broken case.
  • Verify the result with visible output, logs, metrics, compiler feedback, or a table.
  • Summarize the common mistake and the correction.
Common Mistakes to Avoid
WRONG Give an agent unrestricted database write access.
RIGHT Expose narrow tools with authorization and confirmation.
The model should never be your permission system.
WRONG Use vague tool names like run_action.
RIGHT Use specific names like lookup_customer_invoice.
Specific tools produce better tool choices and safer arguments.
WRONG Learning LangChain only as a term.
RIGHT Learn it through a working example, a boundary case, and a failure case.
Concept plus behavior is easier to remember than definition alone.
WRONG Skipping verification.
RIGHT Always check output, state, logs, metrics, query results, or compiler feedback.
Verification turns confidence into evidence.
WRONG Changing many things at once while debugging.
RIGHT Change one setting, input, or line, then inspect the result.
Small changes reveal the real cause.

Practice Tasks

  • Create a read-only agent with tools for product price lookup and tax calculation.
  • Add a confirmation step before any tool that sends an email or creates a ticket.
  • Log tool calls to a list and inspect them after the agent runs.
  • Create a small demo that shows LangChain clearly.
  • Add one edge case and write the expected result before running it.
  • Break the demo intentionally and document the error symptom.
  • Fix the broken version and explain why the fix works.

Frequently Asked Questions

Use an agent when the model must choose among tools or determine the next step dynamically. Use a chain for known workflows.

No. Safety comes from limited tools, validation, permissions, confirmations, logging, and evaluation.

Start with one tiny example, trace every step, then compare it with a broken version.

Verify the visible result: output, state, log entry, metric, query result, compiler feedback, or rendered behavior.

It often combines vocabulary with behavior. The confusion drops when you trace the input, rule, result, and failure path.

Ready to Level Up Your Skills?

Explore 500+ free tutorials across 20+ languages and frameworks.