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
|
Use a submodule for pydantic v1 compat (#9371)
<!-- Thank you for contributing to LangChain!
Replace this entire comment with:
- Description: a description of the change,
- Issue: the issue # it fixes (if applicable),
- Dependencies: any dependencies required for this change,
- Tag maintainer: for a quicker response, tag the relevant maintainer
(see below),
- Twitter handle: we announce bigger features on Twitter. If your PR
gets announced and you'd like a mention, we'll gladly shout you out!
Please make sure your PR is passing linting and testing before
submitting. Run `make format`, `make lint` and `make test` to check this
locally.
See contribution guidelines for more information on how to write/run
tests, lint, etc:
https://github.com/hwchase17/langchain/blob/master/.github/CONTRIBUTING.md
If you're adding a new integration, please include:
1. a test for the integration, preferably unit tests that do not rely on
network access,
2. an example notebook showing its use. These live is docs/extras
directory.
If no one reviews your PR within a few days, please @-mention one of
@baskaryan, @eyurtsev, @hwchase17, @rlancemartin.
-->
2023-08-17 15:35:49 +00:00
|
|
|
from langchain_experimental.pydantic_v1 import BaseModel
|
2023-05-10 04:07:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
class BasePlanner(BaseModel):
|
2023-07-28 20:01:36 +00:00
|
|
|
"""Base planner."""
|
|
|
|
|
2023-05-10 04:07:56 +00:00
|
|
|
@abstractmethod
|
|
|
|
def plan(self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any) -> Plan:
|
2023-06-23 21:47:10 +00:00
|
|
|
"""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:
|
2023-07-28 20:01:36 +00:00
|
|
|
"""Given input, asynchronously decide what to do."""
|
2023-05-10 04:07:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
class LLMPlanner(BasePlanner):
|
2023-07-28 20:01:36 +00:00
|
|
|
"""LLM planner."""
|
|
|
|
|
2023-05-10 04:07:56 +00:00
|
|
|
llm_chain: LLMChain
|
2023-07-28 20:01:36 +00:00
|
|
|
"""The LLM chain to use."""
|
2023-05-10 04:07:56 +00:00
|
|
|
output_parser: PlanOutputParser
|
2023-07-28 20:01:36 +00:00
|
|
|
"""The output parser to use."""
|
2023-05-10 04:07:56 +00:00
|
|
|
stop: Optional[List] = None
|
2023-07-28 20:01:36 +00:00
|
|
|
"""The stop list to use."""
|
2023-05-10 04:07:56 +00:00
|
|
|
|
|
|
|
def plan(self, inputs: dict, callbacks: Callbacks = None, **kwargs: Any) -> Plan:
|
2023-06-23 21:47:10 +00:00
|
|
|
"""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:
|
2023-07-28 20:01:36 +00:00
|
|
|
"""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)
|