# LangChain Agent Roadmap
This roadmap outlines the steps to support LangChain Agent in separate PRs:
1. **Support LCEL Languages**
2. **Support LangChain Agent**
3. **Support LangGraph**
4. **Support Additional Features**
- Example: OpenAI Embeddings (not a Runnable Object)
## Important Concept
How Airflow Agent compile task in flytekit?
```python=
from airflow.sensors.filesystem import FileSensor
sensor = FileSensor(task_id="id", filepath="/tmp/1234")
```
In flyte, we will monkey patch the `FileSensor`'s base class `BaseOperator`, and replace to `a Dataclass Metadata`
![image](https://hackmd.io/_uploads/SJ5x5FDX0.png)
## Support LCEL Languages
It's done. (But only support object callable)
The compile logic is the same as Airflow Agent, I monkey patch a class called `Runnable`
```python=
model = ChatOpenAI(model="gpt-3.5-turbo",
openai_api_key=api_key,
openai_organization="org-NayNG68kGnVXMJ8Ak4PMgQv7",)
prompt = PromptTemplate(
input_variables=[
"question",
],
template="Question: {question}?",
)
output_parser = StrOutputParser()
@workflow
def wf(input: str) -> Union[str, Any]:
message = prompt(input=input)
o0 = model(input=message)
o1 = output_parser(input=o0)
return o1
```
PR link: https://github.com/flyteorg/flytekit/pull/2191
Discuss Doc: https://hackmd.io/T_5pXuVYTkaSDx2Ol7MTuA?view
LangChain Official Doc: https://python.langchain.com/v0.1/docs/expression_language/
## Support LangChain Agent Executor
We can't use airflow agent's compile method to do this.
Since we make LangChain `Runnable` objects to a dataclass metadata,
if we use functions from LangChain package, which needs LangChain `Runnable` objects, we will have error.
Let me show you a langchain agent executor example.
```python=
prompt = hub.pull("hwchase17/react")
def echo_text(input_text: str) -> str:
"""Simple tool that echoes the input text."""
return f"You said: {input_text}"
echo_tool = Tool(
name="echo",
description="A tool that echoes the input text.",
func=echo_text
)
chat = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0.2, api_key=os.getenv('OPENAI_API_KEY'))
tools = [echo_tool]
agent = create_react_agent(chat, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
response = agent_executor.invoke({"input": "hi"})
```
![image](https://hackmd.io/_uploads/HyL0jYDXA.png)
short and concise tutorial: https://youtu.be/Xi9Ui-9qcPw?si=gY0nF3zjZnCH3AVt
## Support LangGraph
LangGraph needs to support both LCEL languages and LangAgents, so we need to support it last.
Concepts: https://langchain-ai.github.io/langgraph/concepts/#data-flow-of-a-single-execution-of-a-stategraph
## Support Additional Features
OpenAI Embeddings's base class in LangChain is not `Runnable`, we need to support it if necessary.
https://python.langchain.com/v0.1/docs/integrations/text_embedding/openai/#embed-query
## Potential problems
1. how many 3rd parties module do we want to support on the agent pod?
It is not reasonable to install all 3rd party intergration.
https://python.langchain.com/v0.1/docs/integrations/platforms/
However, users have to study how to build their own custom image and delpoy to flyteagent, which is a little bit not newbie-friendly.
2. We use Union[str, Any] to support most of LangChain's class as input and output, if we want to use LangChain Agent on Flyte, when input is not `Any`, it is really not friendly for users to input the variables they want.