mirror of
https://github.com/hwchase17/langchain.git
synced 2025-06-23 15:19:33 +00:00
Added async support to PlanAndExecute Chain (#8239)
- Description: Adds async support to the PlanAndExecute Chain Maintainer responsibilities: - Async: @agola11 --------- Co-authored-by: Bagatur <baskaryan@gmail.com>
This commit is contained in:
parent
a3ac9b23eb
commit
bf1357f584
@ -1,6 +1,9 @@
|
|||||||
from typing import Any, Dict, List, Optional
|
from typing import Any, Dict, List, Optional
|
||||||
|
|
||||||
from langchain.callbacks.manager import CallbackManagerForChainRun
|
from langchain.callbacks.manager import (
|
||||||
|
AsyncCallbackManagerForChainRun,
|
||||||
|
CallbackManagerForChainRun,
|
||||||
|
)
|
||||||
from langchain.chains.base import Chain
|
from langchain.chains.base import Chain
|
||||||
from pydantic import Field
|
from pydantic import Field
|
||||||
|
|
||||||
@ -58,3 +61,35 @@ class PlanAndExecute(Chain):
|
|||||||
)
|
)
|
||||||
self.step_container.add_step(step, response)
|
self.step_container.add_step(step, response)
|
||||||
return {self.output_key: self.step_container.get_final_response()}
|
return {self.output_key: self.step_container.get_final_response()}
|
||||||
|
|
||||||
|
async def _acall(
|
||||||
|
self,
|
||||||
|
inputs: Dict[str, Any],
|
||||||
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
plan = await self.planner.aplan(
|
||||||
|
inputs,
|
||||||
|
callbacks=run_manager.get_child() if run_manager else None,
|
||||||
|
)
|
||||||
|
if run_manager:
|
||||||
|
await run_manager.on_text(str(plan), verbose=self.verbose)
|
||||||
|
for step in plan.steps:
|
||||||
|
_new_inputs = {
|
||||||
|
"previous_steps": self.step_container,
|
||||||
|
"current_step": step,
|
||||||
|
"objective": inputs[self.input_key],
|
||||||
|
}
|
||||||
|
new_inputs = {**_new_inputs, **inputs}
|
||||||
|
response = await self.executor.astep(
|
||||||
|
new_inputs,
|
||||||
|
callbacks=run_manager.get_child() if run_manager else None,
|
||||||
|
)
|
||||||
|
if run_manager:
|
||||||
|
await run_manager.on_text(
|
||||||
|
f"*****\n\nStep: {step.value}", verbose=self.verbose
|
||||||
|
)
|
||||||
|
await run_manager.on_text(
|
||||||
|
f"\n\nResponse: {response.response}", verbose=self.verbose
|
||||||
|
)
|
||||||
|
self.step_container.add_step(step, response)
|
||||||
|
return {self.output_key: self.step_container.get_final_response()}
|
||||||
|
@ -2,7 +2,10 @@ from typing import Any, Dict, List, Optional
|
|||||||
|
|
||||||
from pydantic import Field
|
from pydantic import Field
|
||||||
|
|
||||||
from langchain.callbacks.manager import CallbackManagerForChainRun
|
from langchain.callbacks.manager import (
|
||||||
|
AsyncCallbackManagerForChainRun,
|
||||||
|
CallbackManagerForChainRun,
|
||||||
|
)
|
||||||
from langchain.chains.base import Chain
|
from langchain.chains.base import Chain
|
||||||
from langchain.experimental.plan_and_execute.executors.base import BaseExecutor
|
from langchain.experimental.plan_and_execute.executors.base import BaseExecutor
|
||||||
from langchain.experimental.plan_and_execute.planners.base import BasePlanner
|
from langchain.experimental.plan_and_execute.planners.base import BasePlanner
|
||||||
@ -63,3 +66,35 @@ class PlanAndExecute(Chain):
|
|||||||
)
|
)
|
||||||
self.step_container.add_step(step, response)
|
self.step_container.add_step(step, response)
|
||||||
return {self.output_key: self.step_container.get_final_response()}
|
return {self.output_key: self.step_container.get_final_response()}
|
||||||
|
|
||||||
|
async def _acall(
|
||||||
|
self,
|
||||||
|
inputs: Dict[str, Any],
|
||||||
|
run_manager: Optional[AsyncCallbackManagerForChainRun] = None,
|
||||||
|
) -> Dict[str, Any]:
|
||||||
|
plan = await self.planner.aplan(
|
||||||
|
inputs,
|
||||||
|
callbacks=run_manager.get_child() if run_manager else None,
|
||||||
|
)
|
||||||
|
if run_manager:
|
||||||
|
await run_manager.on_text(str(plan), verbose=self.verbose)
|
||||||
|
for step in plan.steps:
|
||||||
|
_new_inputs = {
|
||||||
|
"previous_steps": self.step_container,
|
||||||
|
"current_step": step,
|
||||||
|
"objective": inputs[self.input_key],
|
||||||
|
}
|
||||||
|
new_inputs = {**_new_inputs, **inputs}
|
||||||
|
response = await self.executor.astep(
|
||||||
|
new_inputs,
|
||||||
|
callbacks=run_manager.get_child() if run_manager else None,
|
||||||
|
)
|
||||||
|
if run_manager:
|
||||||
|
await run_manager.on_text(
|
||||||
|
f"*****\n\nStep: {step.value}", verbose=self.verbose
|
||||||
|
)
|
||||||
|
await run_manager.on_text(
|
||||||
|
f"\n\nResponse: {response.response}", verbose=self.verbose
|
||||||
|
)
|
||||||
|
self.step_container.add_step(step, response)
|
||||||
|
return {self.output_key: self.step_container.get_final_response()}
|
||||||
|
Loading…
Reference in New Issue
Block a user