# Force tool calling in langraph swarm

**URL:** <https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726>\
**Category:** LangGraph\
**Tags:** python-help\
**Created:** [October 1, 2025, 11:30pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726 "2025-10-01T23:30:25Z")\
**Posts on this page:** 10\
**Page:** 2

<div class="post-metadata">

**Author:** ![polo15s](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/polo15s/32/1161_2.png) [@polo15s](https://forum.langchain.com/u/polo15s)\
**Post date:** [October 2, 2025, 5:39pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/21 "2025-10-02T17:39:36Z")

</div>

Sorry that wont be possible. I have signed a NDA and its a entire product and the company wont allow to share it

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 2, 2025, 5:41pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/22 "2025-10-02T17:41:41Z")

</div>

Ok, I understand. Then tell me the exact versions (langchain, langgraph) you are using - I’ll try to reproduce the code to some extent.

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 2, 2025, 6:58pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/23 "2025-10-02T18:58:52Z")

</div>

btw this code works for me:

```auto
import os
from typing import Optional

from dotenv import load_dotenv
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent
from langchain.chat_models import init_chat_model
from langgraph_swarm import create_swarm
from langchain_core.tools import tool

load_dotenv(verbose=True)

# -----------------------llm----------------------
llm = init_chat_model(
    "claude-3-7-sonnet-latest",
    model_provider="anthropic",
    api_key=os.getenv("ANTHROPIC_API_KEY", ""),
)

@tool()
def document_retriever(query: str, domain_name: str, user_folder: Optional[str] = None, website_name: Optional[str] = None) -> str:
    """
    Tool to retrieve relevant documents using hybrid search (vector + BM25) from web-scraped content.

    Args:
        query (str): The search query
        domain_name (str): Name of the domain/website for the vector store
        user_folder (str, Optional): Username to use in the path (optional)
        website_name (str, Optional): Name of the website folder (optional, defaults to "brandsmithworldwide")

    Returns:
        Retrieved content as formatted text
    """
    print(f"Retrieving `{query}` from `{domain_name}` (user: `{user_folder})`, website: `{website_name})`")
    return "His name is Paul."

def make_rag_prompt():
    return "You are an helpful assistant."

def get_all_agent_tools():
    return [document_retriever]

def create_rag_agent():
    """Create the RAG agent with all tools from ToolFactory"""
    # Get all tools for the agent
    all_tools = get_all_agent_tools()
    # llm_with_tools = llm.bind_tools(all_tools, strict=True)
    print('--' * 30)
    print(f"Creating RAG agent with {len(all_tools)} tools")
    for _tool in all_tools:
        tool_name = getattr(_tool, 'name', 'unnamed_tool')
        print(f"Tool: {tool_name}")
    print('--' * 30)
    # model_with_tools = self.model.bind_tools(tools=all_tools, tool_choice={"type": "tool", "name": "document_retriever"})
    return create_react_agent(
        model=llm.bind_tools(all_tools, tool_choice="auto"),
        tools=all_tools,
        prompt=make_rag_prompt(),
        name="rag_agent"
    )

builder = create_swarm(
            [create_rag_agent()],
            default_active_agent="rag_agent"
        )

graph = builder.compile()

answer = graph.invoke({"messages": [HumanMessage("Hi! What is the name of the main actor of \"No way!\" movie? Domain: movies. Folder: all. Website: NONE.")]})

print(answer["messages"][1])

```

Response:

```terminal
------------------------------------------------------------
Creating RAG agent with 1 tools
Tool: document_retriever
------------------------------------------------------------
Retrieving `No way! movie main actor` from `movies` (user: `all)`, website: `None)`
content=[{'text': 'To find information about the main actor of the "No way!" movie, I can search for this in the movies domain. Let me do that for you.', 'type': 'text'}, {'id': 'toolu_01X4MuruiDVbcth48Jii2Nim', 'input': {'query': 'No way! movie main actor', 'domain_name': 'movies', 'user_folder': 'all'}, 'name': 'document_retriever', 'type': 'tool_use'}] additional_kwargs={} response_metadata={'id': 'msg_019SnJfmkSLWy9q3EPHbAU78', 'model': 'claude-3-7-sonnet-20250219', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 601, 'output_tokens': 130, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-7-sonnet-20250219'} name='rag_agent' id='run--5a5c2b5d-20a2-4816-8f3d-b691c2432957-0' tool_calls=[{'name': 'document_retriever', 'args': {'query': 'No way! movie main actor', 'domain_name': 'movies', 'user_folder': 'all'}, 'id': 'toolu_01X4MuruiDVbcth48Jii2Nim', 'type': 'tool_call'}] usage_metadata={'input_tokens': 601, 'output_tokens': 130, 'total_tokens': 731, 'input_token_details': {'cache_read': 0, 'cache_creation': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}

```

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 2, 2025, 7:01pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/24 "2025-10-02T19:01:19Z")

</div>

When I remove `Return` from docstring it still works:

```
"""
Tool to retrieve relevant documents using hybrid search (vector + BM25) from web-scraped content.

Args:
    query (str): The search query
    domain_name (str): Name of the domain/website for the vector store
    user_folder (str, Optional): Username to use in the path (optional)
    website_name (str, Optional): Name of the website folder (optional, defaults to "brandsmithworldwide")
"""

```

Response:

```auto
------------------------------------------------------------
Creating RAG agent with 1 tools
Tool: document_retriever
------------------------------------------------------------
Retrieving `No way! movie main actor` from `movies` (user: `all)`, website: `None)`
content=[{'text': 'I\'ll help you find information about the main actor of the "No way!" movie. Let me search for that information using the document retriever tool.', 'type': 'text'}, {'id': 'toolu_01Bd5jGKwwFbSGsvFtzC1D5V', 'input': {'query': 'No way! movie main actor', 'domain_name': 'movies', 'user_folder': 'all'}, 'name': 'document_retriever', 'type': 'tool_use'}] additional_kwargs={} response_metadata={'id': 'msg_01GJaPJaUNYufnd99h6WrHwR', 'model': 'claude-3-7-sonnet-20250219', 'stop_reason': 'tool_use', 'stop_sequence': None, 'usage': {'cache_creation': {'ephemeral_1h_input_tokens': 0, 'ephemeral_5m_input_tokens': 0}, 'cache_creation_input_tokens': 0, 'cache_read_input_tokens': 0, 'input_tokens': 586, 'output_tokens': 129, 'server_tool_use': None, 'service_tier': 'standard'}, 'model_name': 'claude-3-7-sonnet-20250219'} name='rag_agent' id='run--c77b9e43-2bf1-40fe-92a9-9459e838a36c-0' tool_calls=[{'name': 'document_retriever', 'args': {'query': 'No way! movie main actor', 'domain_name': 'movies', 'user_folder': 'all'}, 'id': 'toolu_01Bd5jGKwwFbSGsvFtzC1D5V', 'type': 'tool_call'}] usage_metadata={'input_tokens': 586, 'output_tokens': 129, 'total_tokens': 715, 'input_token_details': {'cache_read': 0, 'cache_creation': 0, 'ephemeral_5m_input_tokens': 0, 'ephemeral_1h_input_tokens': 0}}

```

---

<div class="post-metadata">

**Author:** ![polo15s](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/polo15s/32/1161_2.png) [@polo15s](https://forum.langchain.com/u/polo15s)\
**Post date:** [October 4, 2025, 11:56pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/25 "2025-10-04T23:56:16Z")

</div>

Extactly! I know there is no issue with the code, yet i get the error.  
I dont know how to fix it

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 5, 2025, 10:12am UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/26 "2025-10-05T10:12:46Z")

</div>

Could it be magic? 🙂 There must be a reason somewhere 🧐

---

<div class="post-metadata">

**Author:** ![heisenberg-7](https://avatars.discourse-cdn.com/v4/letter/h/73ab20/32.png) [@heisenberg-7](https://forum.langchain.com/u/heisenberg-7)\
**Post date:** [October 5, 2025, 1:12pm UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/27 "2025-10-05T13:12:01Z")

</div>

> [@pawel-twardziak](#):
>
> exact versions (langchain, langgraph) you are using

@polo15s Could you share the versions to try to reproduce on those exact version?

---

<div class="post-metadata">

**Author:** ![polo15s](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/polo15s/32/1161_2.png) [@polo15s](https://forum.langchain.com/u/polo15s)\
**Post date:** [October 6, 2025, 7:21am UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/28 "2025-10-06T07:21:36Z")

</div>

> [@pawel-twardziak](#):
>
> `bind_tools(all_tools, tool_choice="auto"),`

Hey, I solved the issue  
The issue was with the wrapper function in the class.

---

<div class="post-metadata">

**Author:** ![heisenberg-7](https://avatars.discourse-cdn.com/v4/letter/h/73ab20/32.png) [@heisenberg-7](https://forum.langchain.com/u/heisenberg-7)\
**Post date:** [October 6, 2025, 8:55am UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/29 "2025-10-06T08:55:01Z")

</div>

What was the issue?

---

<div class="post-metadata">

**Author:** ![pawel-twardziak](https://yyz1.discourse-cdn.com/flex007/user_avatar/forum.langchain.com/pawel-twardziak/32/960_2.png) [@pawel-twardziak](https://forum.langchain.com/u/pawel-twardziak)\
**Post date:** [October 6, 2025, 11:13am UTC](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726/30 "2025-10-06T11:13:52Z")

</div>

@polo15s it would be great if you share the solution code so that it benefits others 🙂

[Previous page](https://forum.langchain.com/t/force-tool-calling-in-langraph-swarm/1726.md?page=1)
