mirror of
https://github.com/Mintplex-Labs/langchain-python.git
synced 2026-07-22 17:25:22 -04:00
10dab053b4
This pull request adds an enum class for the various types of agents used in the project, located in the `agent_types.py` file. Currently, the project is using hardcoded strings for the initialization of these agents, which can lead to errors and make the code harder to maintain. With the introduction of the new enums, the code will be more readable and less error-prone. The new enum members include: - ZERO_SHOT_REACT_DESCRIPTION - REACT_DOCSTORE - SELF_ASK_WITH_SEARCH - CONVERSATIONAL_REACT_DESCRIPTION - CHAT_ZERO_SHOT_REACT_DESCRIPTION - CHAT_CONVERSATIONAL_REACT_DESCRIPTION In this PR, I have also replaced the hardcoded strings with the appropriate enum members throughout the codebase, ensuring a smooth transition to the new approach.
70 lines
2.5 KiB
Python
70 lines
2.5 KiB
Python
"""Load agent."""
|
|
from typing import Any, Optional, Sequence
|
|
|
|
from langchain.agents.agent import AgentExecutor
|
|
from langchain.agents.agent_types import AgentType
|
|
from langchain.agents.loading import AGENT_TO_CLASS, load_agent
|
|
from langchain.callbacks.base import BaseCallbackManager
|
|
from langchain.schema import BaseLanguageModel
|
|
from langchain.tools.base import BaseTool
|
|
|
|
|
|
def initialize_agent(
|
|
tools: Sequence[BaseTool],
|
|
llm: BaseLanguageModel,
|
|
agent: Optional[AgentType] = None,
|
|
callback_manager: Optional[BaseCallbackManager] = None,
|
|
agent_path: Optional[str] = None,
|
|
agent_kwargs: Optional[dict] = None,
|
|
**kwargs: Any,
|
|
) -> AgentExecutor:
|
|
"""Load an agent executor given tools and LLM.
|
|
|
|
Args:
|
|
tools: List of tools this agent has access to.
|
|
llm: Language model to use as the agent.
|
|
agent: Agent type to use. If None and agent_path is also None, will default to
|
|
AgentType.ZERO_SHOT_REACT_DESCRIPTION.
|
|
callback_manager: CallbackManager to use. Global callback manager is used if
|
|
not provided. Defaults to None.
|
|
agent_path: Path to serialized agent to use.
|
|
agent_kwargs: Additional key word arguments to pass to the underlying agent
|
|
**kwargs: Additional key word arguments passed to the agent executor
|
|
|
|
Returns:
|
|
An agent executor
|
|
"""
|
|
if agent is None and agent_path is None:
|
|
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
|
|
if agent is not None and agent_path is not None:
|
|
raise ValueError(
|
|
"Both `agent` and `agent_path` are specified, "
|
|
"but at most only one should be."
|
|
)
|
|
if agent is not None:
|
|
if agent not in AGENT_TO_CLASS:
|
|
raise ValueError(
|
|
f"Got unknown agent type: {agent}. "
|
|
f"Valid types are: {AGENT_TO_CLASS.keys()}."
|
|
)
|
|
agent_cls = AGENT_TO_CLASS[agent]
|
|
agent_kwargs = agent_kwargs or {}
|
|
agent_obj = agent_cls.from_llm_and_tools(
|
|
llm, tools, callback_manager=callback_manager, **agent_kwargs
|
|
)
|
|
elif agent_path is not None:
|
|
agent_obj = load_agent(
|
|
agent_path, llm=llm, tools=tools, callback_manager=callback_manager
|
|
)
|
|
else:
|
|
raise ValueError(
|
|
"Somehow both `agent` and `agent_path` are None, "
|
|
"this should never happen."
|
|
)
|
|
return AgentExecutor.from_agent_and_tools(
|
|
agent=agent_obj,
|
|
tools=tools,
|
|
callback_manager=callback_manager,
|
|
**kwargs,
|
|
)
|