langchain/libs/experimental/langchain_experimental/plan_and_execute/planners/base.py

48 lines
1.5 KiB
Python
Raw Normal View History

2023-05-10 04:07:56 +00:00
from abc import abstractmethod
from typing import Any, List, Optional
from langchain.callbacks.manager import Callbacks
from langchain.chains.llm import LLMChain
2023-07-22 01:44:32 +00:00
from langchain_experimental.plan_and_execute.schema import Plan, PlanOutputParser
from langchain_experimental.pydantic_v1 import BaseModel
2023-05-10 04:07:56 +00:00
class BasePlanner(BaseModel):
"""Base planner."""
2023-05-10 04:07:56 +00:00
@abstractmethod
def plan(self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any) -> Plan:
"""Given input, decide what to do."""
2023-05-10 04:07:56 +00:00
@abstractmethod
async def aplan(
self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any
) -> Plan:
"""Given input, asynchronously decide what to do."""
2023-05-10 04:07:56 +00:00
class LLMPlanner(BasePlanner):
"""LLM planner."""
2023-05-10 04:07:56 +00:00
llm_chain: LLMChain
"""The LLM chain to use."""
2023-05-10 04:07:56 +00:00
output_parser: PlanOutputParser
"""The output parser to use."""
2023-05-10 04:07:56 +00:00
stop: Optional[List] = None
"""The stop list to use."""
2023-05-10 04:07:56 +00:00
def plan(self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any) -> Plan:
"""Given input, decide what to do."""
2023-05-10 04:07:56 +00:00
llm_response = self.llm_chain.run(**inputs, stop=self.stop, callbacks=callbacks)
return self.output_parser.parse(llm_response)
async def aplan(
self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any
) -> Plan:
"""Given input, asynchronously decide what to do."""
2023-05-10 04:07:56 +00:00
llm_response = await self.llm_chain.arun(
**inputs, stop=self.stop, callbacks=callbacks
)
return self.output_parser.parse(llm_response)