Home / Function/ _prepare_selection_request() — langchain Function Reference

_prepare_selection_request() — langchain Function Reference

Architecture documentation for the _prepare_selection_request() function in tool_selection.py from the langchain codebase.

Entity Profile

Dependency Diagram

graph TD
  bdf758af_80be_0125_ef7b_855624a8a30a["_prepare_selection_request()"]
  888c953d_8f6f_ac7f_4274_ca04589e186a["LLMToolSelectorMiddleware"]
  bdf758af_80be_0125_ef7b_855624a8a30a -->|defined in| 888c953d_8f6f_ac7f_4274_ca04589e186a
  79ce050f_9134_368b_2f3c_59dd0f33524c["wrap_model_call()"]
  79ce050f_9134_368b_2f3c_59dd0f33524c -->|calls| bdf758af_80be_0125_ef7b_855624a8a30a
  914b6a96_704c_ef23_6236_b6d24e64245f["awrap_model_call()"]
  914b6a96_704c_ef23_6236_b6d24e64245f -->|calls| bdf758af_80be_0125_ef7b_855624a8a30a
  style bdf758af_80be_0125_ef7b_855624a8a30a fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

libs/langchain_v1/langchain/agents/middleware/tool_selection.py lines 158–230

    def _prepare_selection_request(
        self, request: ModelRequest[ContextT]
    ) -> _SelectionRequest | None:
        """Prepare inputs for tool selection.

        Args:
            request: the model request.

        Returns:
            `SelectionRequest` with prepared inputs, or `None` if no selection is
            needed.

        Raises:
            ValueError: If tools in `always_include` are not found in the request.
            AssertionError: If no user message is found in the request messages.
        """
        # If no tools available, return None
        if not request.tools or len(request.tools) == 0:
            return None

        # Filter to only BaseTool instances (exclude provider-specific tool dicts)
        base_tools = [tool for tool in request.tools if not isinstance(tool, dict)]

        # Validate that always_include tools exist
        if self.always_include:
            available_tool_names = {tool.name for tool in base_tools}
            missing_tools = [
                name for name in self.always_include if name not in available_tool_names
            ]
            if missing_tools:
                msg = (
                    f"Tools in always_include not found in request: {missing_tools}. "
                    f"Available tools: {sorted(available_tool_names)}"
                )
                raise ValueError(msg)

        # Separate tools that are always included from those available for selection
        available_tools = [tool for tool in base_tools if tool.name not in self.always_include]

        # If no tools available for selection, return None
        if not available_tools:
            return None

        system_message = self.system_prompt
        # If there's a max_tools limit, append instructions to the system prompt
        if self.max_tools is not None:
            system_message += (
                f"\nIMPORTANT: List the tool names in order of relevance, "
                f"with the most relevant first. "
                f"If you exceed the maximum number of tools, "
                f"only the first {self.max_tools} will be used."
            )

        # Get the last user message from the conversation history
        last_user_message: HumanMessage
        for message in reversed(request.messages):
            if isinstance(message, HumanMessage):
                last_user_message = message
                break
        else:
            msg = "No user message found in request messages"
            raise AssertionError(msg)

        model = self.model or request.model
        valid_tool_names = [tool.name for tool in available_tools]

        return _SelectionRequest(
            available_tools=available_tools,
            system_message=system_message,
            last_user_message=last_user_message,
            model=model,
            valid_tool_names=valid_tool_names,
        )

Domain

Subdomains

Frequently Asked Questions

What does _prepare_selection_request() do?
_prepare_selection_request() is a function in the langchain codebase, defined in libs/langchain_v1/langchain/agents/middleware/tool_selection.py.
Where is _prepare_selection_request() defined?
_prepare_selection_request() is defined in libs/langchain_v1/langchain/agents/middleware/tool_selection.py at line 158.
What calls _prepare_selection_request()?
_prepare_selection_request() is called by 2 function(s): awrap_model_call, wrap_model_call.

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free