Docs Draft (#286)

This commit is contained in:
William FH
2024-04-15 22:44:12 -07:00
committed by GitHub
parent eb10fe599b
commit 85f48da84e
22 changed files with 544 additions and 527 deletions
+1 -2
View File
@@ -1,4 +1,4 @@
name: Deploy SDK Docs
name: Deploy Docs
on:
push:
@@ -36,7 +36,6 @@ jobs:
poetry run pip install -r docs/docs-requirements.txt
- name: Build site
working-directory: ./docs
run: make build-docs
- name: Configure GitHub Pages
+1 -1
View File
@@ -51,7 +51,7 @@ spell_fix:
build-docs:
poetry run python docs/_scripts/copy_notebooks.py
poetry run mkdocs build --clean -f docs/mkdocs.yml
poetry run mkdocs build --clean -f docs/mkdocs.yml --strict
serve-docs: build-docs
poetry run mkdocs serve -f docs/mkdocs.yml
+2 -86
View File
@@ -3,6 +3,7 @@
[![Downloads](https://static.pepy.tech/badge/langgraph/month)](https://pepy.tech/project/langgraph)
[![Open Issues](https://img.shields.io/github/issues-raw/langchain-ai/langgraph)](https://github.com/langchain-ai/langgraph/issues)
[![](https://dcbadge.vercel.app/api/server/6adMQxSpJS?compact=true&style=flat)](https://discord.com/channels/1038097195422978059/1170024642245832774)
[![Docs](https://img.shields.io/badge/docs-latest-blue)](https://langchain-ai.github.io/langgraph/)
⚡ Building language agents as graphs ⚡
@@ -524,92 +525,7 @@ content='' additional_kwargs={'function_call': {'arguments': '{\n', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' ', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' "', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': 'query', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': '":', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' "', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': 'weather', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' in', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' San', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': ' Francisco', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': '"\n', 'name': ''}}
content='' additional_kwargs={'function_call': {'arguments': '}', 'name': ''}}
content=''
content=''
content='I'
content="'m"
content=' sorry'
content=','
content=' but'
content=' I'
content=' couldn'
content="'t"
content=' find'
content=' the'
content=' current'
content=' weather'
content=' in'
content=' San'
content=' Francisco'
content='.'
content=' However'
content=','
content=' you'
content=' can'
content=' check'
content=' the'
content=' historical'
content=' weather'
content=' data'
content=' for'
content=' January'
content=' '
content='202'
content='4'
content=' in'
content=' San'
content=' Francisco'
content=' ['
content='here'
content=']('
content='https'
content='://'
content='we'
content='athers'
content='park'
content='.com'
content='/h'
content='/m'
content='/'
content='557'
content='/'
content='202'
content='4'
content='/'
content='1'
content='/H'
content='istorical'
content='-'
content='Weather'
content='-in'
content='-Jan'
content='uary'
content='-'
content='202'
content='4'
content='-in'
content='-S'
content='an'
content='-F'
content='r'
content='anc'
content='isco'
content='-Cal'
content='ifornia'
content='-'
content='United'
content='-'
content='States'
content=').'
content=''
...
```
## When to Use
+55 -11
View File
@@ -9,7 +9,33 @@ docs_dir = root_dir / "docs/docs"
how_tos_dir = docs_dir / "how-tos"
tutorials_dir = docs_dir / "tutorials"
_MANUAL = {
"how-tos": [
"async.ipynb",
"streaming-tokens.ipynb",
"human-in-the-loop.ipynb",
"persistence.ipynb",
"time-travel.ipynb",
"visualization.ipynb",
"state-model.ipynb",
"subgraph.ipynb",
"persistence_postgres.ipynb",
"branching.ipynb",
],
"tutorials": [
"chat_agent_executor_with_function_calling/base.ipynb",
"chat_agent_executor_with_function_calling/high-level.ipynb",
"chat_agent_executor_with_function_calling/high-level-tools.ipynb",
"chat_agent_executor_with_function_calling/prebuilt-tool-node.ipynb",
"agent_executor/base.ipynb",
"agent_executor/high-level.ipynb",
],
}
_MANUAL_INVERSE = {v: docs_dir / k for k, vs in _MANUAL.items() for v in vs}
_HOW_TOS = {"agent_executor", "chat_agent_executor_with_function_calling", "docs"}
_MAP = {
"persistence_postgres.ipynb": "tutorial",
}
_IGNORE = (".ipynb_checkpoints", ".venv", ".cache")
@@ -33,30 +59,48 @@ def clean_notebooks():
def copy_notebooks():
# Nested ones are mostly tutorials rn
for root, dirs, files in os.walk(examples_dir):
if root == str(examples_dir):
continue
if any(path.startswith(".") or path.startswith("__") for path in root.split(os.sep)):
if any(
path.startswith(".") or path.startswith("__") for path in root.split(os.sep)
):
continue
if any(path in _HOW_TOS for path in root.split(os.sep)):
dst_dir = how_tos_dir
else:
dst_dir = tutorials_dir
for file in files:
if file.endswith(".ipynb"):
dst_dir_ = dst_dir
if file.endswith((".ipynb", ".png")):
if file in _MAP:
dst_dir = os.path.join(dst_dir, _MAP[file])
src_path = os.path.join(root, file)
dst_path = os.path.join(
dst_dir, os.path.relpath(src_path, examples_dir)
)
for k in _MANUAL_INVERSE:
if src_path.endswith(k):
overridden_dir = _MANUAL_INVERSE[k]
dst_path = os.path.join(overridden_dir, os.path.relpath(src_path, examples_dir))
print(f"Overriding {src_path} to {dst_path}")
break
os.makedirs(os.path.dirname(dst_path), exist_ok=True)
shutil.copy(src_path, dst_path)
# Convert all ./img/* to ../img/*
if file.endswith(".ipynb"):
with open(dst_path, "r") as f:
content = f.read()
content = content.replace("(./img/", "(../img/")
with open(dst_path, "w") as f:
f.write(content)
dst_dir = dst_dir_
# Top level notebooks are "how-to's"
for file in examples_dir.iterdir():
if file.suffix.endswith(".ipynb") and not os.path.isdir(
os.path.join(examples_dir, file)
):
src_path = os.path.join(examples_dir, file)
dst_path = os.path.join(docs_dir, "how-tos", file.name)
shutil.copy(src_path, dst_path)
# for file in examples_dir.iterdir():
# if file.suffix.endswith(".ipynb") and not os.path.isdir(
# os.path.join(examples_dir, file)
# ):
# src_path = os.path.join(examples_dir, file)
# dst_path = os.path.join(docs_dir, "how-tos", file.name)
# shutil.copy(src_path, dst_path)
if __name__ == "__main__":
-4
View File
@@ -1,4 +0,0 @@
# Concepts
## State
+20 -15
View File
@@ -2,24 +2,29 @@
Welcome to the LangGraph How-To Guides! These guides provide practical, step-by-step instructions for accomplishing key tasks in LangGraph.
## Basics
- [State Management](state-model.ipynb): How to define and manage complex state in your graphs
- [Tool Integration](sql_example.ipynb): How to integrate external tools and data sources
- [Human-in-the-Loop](human-in-the-loop.ipynb): How to incorporate human feedback and intervention
## Performance
## Core
- [Async Execution](async.ipynb): How to run nodes asynchronously for improved performance
- [Streaming Responses](streaming-tokens.ipynb): How to stream agent responses in real-time
## Graph Structure
- [Subgraphs](subgraph.ipynb): How to modularize your graphs with subgraphs
- [Human-in-the-Loop](human-in-the-loop.ipynb): How to incorporate human feedback and intervention
- [Persistence](persistence.ipynb): How to save and load graph state for long-running applications
- [Time Travel](time-travel.ipynb): How to navigate and manipulate graph state history
- [Visualization](visualization.ipynb): How to visualize your graphs
- [Pydantic State](state-model.ipynb): Use a pydantic model as your state
- [Subgraphs](subgraph.ipynb): How to compose subgraphs within a larger graph
- [Branching](branching.ipynb): How to create branching logic in your graphs
## Development
## AgentExecutor
- [Human-in-the-Loop](agent_executor/human-in-the-loop.ipynb)
- [Force Tool First](agent_executor/force-calling-a-tool-first.ipynb)
- [Manage Agent Steps](agent_executor/managing-agent-steps.ipynb)
## Chat Agent (Function Calling)
- [Human-in-the-Loop](chat_agent_executor_with_function_calling/human-in-the-loop.ipynb)
- [Force Tool First](chat_agent_executor_with_function_calling/force-calling-a-tool-first.ipynb)
- [Respond in Format](chat_agent_executor_with_function_calling/respond-in-format.ipynb)
- [Dynamic Direct Return](chat_agent_executor_with_function_calling/dynamically-returning-directly.ipynb)
- [Manage Agent Steps](chat_agent_executor_with_function_calling/managing-agent-steps.ipynb)
- [Persistence](persistence.ipynb): How to save and load graph state for long-running applications
- [Visualization](visualization.ipynb): How to visualize your graphs
- [Time Travel](time-travel.ipynb): How to navigate and manipulate graph execution history
+71 -79
View File
@@ -4,119 +4,111 @@
⚡ Build language agents as graphs ⚡
## Overview
Suppose you're building a customer support assistant. You want your assistant to:
Suppose you're building a customer support assistant. You want your assistant to be able to:
1. Try to answer user questions using a knowledge base
2. Escalate to a human if it's not confident in its answer
3. Relay the human's resolution back to the user
4. Remember the full conversation context across multiple user messages
1. Use tools to respond to questions
2. Connect with a human if needed
3. Be able to pause the process indefinitely and resume whenever the human responds
With raw LLMs, the code to control the agentic loop, conversation state, route between the chatbot and human, and checkpoint the full application state can get complex.
LangGraph makes this all easy. First install:
LangGraph makes it simple. First install:
```shell
```bash
pip install -U langgraph
```
Then define your assistant:
```python
from langgraph.graph import StateGraph
import json
from langchain_anthropic import ChatAnthropic
from langchain_community.tools.tavily_search import TavilySearchResults
from langgraph.checkpoint.sqlite import SqliteSaver
from langchain_anthropic
from langgraph.graph import END, MessageGraph
from langgraph.prebuilt.tool_node import ToolNode
# Define the chatbot state
class ChatbotState(TypedDict):
conversation_history: Annotated[ConversationHistory, operator.add]
pending_human_request: Optional[HumanRequest]
# Create nodes for the chatbot and human
def chatbot(state: ChatbotState):
# TODO
def human(state: ChatbotState):
# TODO
# Create the graph
graph = StateGraph(ChatbotState)
graph.add_node("chatbot", chatbot)
graph.add_node("human", human)
# Define routing logic between chatbot and human
def should_escalate(state):
if state['pending_human_request']:
return "human"
# Define the function that determines whether to continue or not
def should_continue(messages):
last_message = messages[-1]
# If there is no function call, then we finish
if not last_message.tool_calls:
return END
else:
return "chatbot"
return "action"
graph.add_conditional_edges("chatbot", should_escalate, {
"human": "human",
"chatbot": "chatbot"
})
graph.add_edge("human", "chatbot")
# Define a new graph
workflow = MessageGraph()
memory = SqliteSaver.from_conn_string(":memory:")
app = graph.compile(checkpointer=memory)
# Run the graph
result = app.invoke(new_user_message)
tools = [TavilySearchResults(max_results=1)]
model = ChatAnthropic(model="claude-3-haiku-20240307").bind_tools(tools)
workflow.add_node("agent", model)
workflow.add_node("action", ToolNode(tools))
workflow.set_entry_point("agent")
# Conditional agent -> action OR agent -> END
workflow.add_conditional_edges(
"agent",
should_continue,
)
# Always transition `action` -> `agent`
workflow.add_edge("action", "agent")
memory = SqliteSaver.from_conn_string(":memory:") # Here we only save in-memory
# Setting the interrupt means that any time an action is called, the machine will stop
app = workflow.compile(checkpointer=memory, interrupt_before=["action"])
```
The graph handles all the hard parts:
Now, run the graph:
- `conversation_history` in the state contains the assistant's "memory"
- Conditional edges enable dynamic routing between the chatbot and human based on the chatbot's confidence
- Persistence makes it easy to route to a human so they can respond and resume at any time
```python
# Run the graph
thread = {"configurable": {"thread_id": "4"}}
for event in app.stream("what is the weather in sf currently", thread):
for v in event.values():
print(v)
```
We configured the graph to **wait** before executing the `action`. The `SqliteSaver` persists the state. Resume at any time.
```python
for event in app.stream(None, thread):
for v in event.values():
print(v)
```
The graph orchestrates everything:
- The `MessageGraph` contains the agent's "Memory"
- Conditional edges enable dynamic routing between the chatbot, tools, and the user
- Persistence makes it easy to stop, resume, and even rewind for full control over your application
With LangGraph, you can build complex, stateful agents without getting bogged down in manual state and interrupt management. Just define your nodes, edges, and state schema - and let the graph take care of the rest.
## Concepts
- [Graphs](concepts.md#graphs)
- [State](concepts.md#state): The data structure passed between nodes, allowing you to persist context
- [Nodes](concepts.#nodes): The building blocks of your graph - LLMs, tools, or custom logic
- [Edges](concepts.md#edges): The connections that define the flow of data between your nodes
- [Conditional Edges](concepts.md#conditional_edges): Special edges that let you dynamically route between nodes based on state
- [Persistence](concepts.md#persistence): Save and resume your graph's state for long-running applications
## How-To Guides
Check out the [How-To Guides](how-tos/index.md) for instructions on handling common tasks with LangGraph.
- Manage State
- Tool Integration
- Human-in-the-Loop
- Async Execution
- Streaming Responses
- Subgraphs & Branching
- Persistence, Visualization, Time Travel
- Benchmarking
## Tutorials
Consult the [Tutorials](tutorials/index.md) to learn more about implementing advanced
Consult the [Tutorials](tutorials/index.md) to learn more about building with LangGraph, including advanced use cases.
- **Agent Executors**: Chat and Langchain agents
- **Planning Agents**: Plan-and-Execute, ReWOO, LLMCompiler
- **Reflection & Critique**: Improving quality via reflection
- **Multi-Agent Systems**: Collaboration, supervision, teams
- **Research & QA**: Web research, retrieval-augmented QA
- **Applications**: Chatbots, code assist, web tasks
- **Evaluation & Analysis**: Simulation, self-discovery, swarms
## How-To Guides
Check out the [How-To Guides](how-tos/index.md) for instructions on handling common tasks with LangGraph
## Why LangGraph?
LangGraph extends the core strengths of LangChain Runnables (shared interface for streaming, async, and batch calls) to make it easy to:
LangGraph is framework agnostic (each node is a regular python function). It extends the core Runnable API (shared interface for streaming, async, and batch calls) to make it easy to:
- Seamless state management across multiple turns of conversation or tool usage
- The ability to flexibly route between nodes based on dynamic criteria
- Smooth switching between LLMs and human intervention
- Persistence for long-running, multi-session applications
If you're building a straightforward DAG,, LangChain expression language is a great fit. But for more complex, stateful applications with nonlinear flows, LangGraph is the perfect tool for the job.
If you're building a straightforward DAG, Runnables are a great fit. But for more complex, stateful applications with nonlinear flows, LangGraph is the perfect tool for the job.
-7
View File
@@ -1,11 +1,4 @@
# Checkpoints
::: langgraph.checkpoint
handler: python
options:
selection:
docstring_style: google
rendering:
heading_level: 3
show_root_toc_entry: false
+9 -8
View File
@@ -1,11 +1,12 @@
# StateGraph
# Graph Definitions
::: langgraph.graph
handler: python
options:
selection:
docstring_style: google
rendering:
heading_level: 3
show_root_toc_entry: false
## CompiledGraph
::: langgraph.graph.graph.CompiledGraph
handler: python
members:
- get_graph
- invoke
+45 -8
View File
@@ -1,11 +1,48 @@
# Prebuilt
# Prebuilt
## ToolNode
::: langgraph.prebuilt
```python
from langgraph.prebuilt import ToolNode
```
::: langgraph.prebuilt.ToolNode
handler: python
options:
selection:
docstring_style: google
rendering:
heading_level: 3
show_root_toc_entry: false
## ToolExecutor
```python
from langgraph.prebuilt import ToolExecutor
```
::: langgraph.prebuilt.ToolExecutor
handler: python
## ToolInvocation
```python
from langgraph.prebuilt import ToolInvocation
```
::: langgraph.prebuilt.ToolInvocation
handler: python
heading_level: 4
## `chat_agent_executor.create_tool_calling_executor`
```python
from langgraph.prebuilt.chat_agent_executor import create_tool_calling_executor
```
::: langgraph.prebuilt.chat_agent_executor
## `create_agent_executor`
```python
from langgraph.prebuilt import create_agent_executor
```
::: langgraph.prebuilt.create_agent_executor
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

+48 -48
View File
@@ -1,69 +1,69 @@
# Tutorials
Welcome to the LangGraph Tutorials! These notebooks provide end-to-end walkthroughs for building various types of language agents and applications using LangGraph.
Welcome to the LangGraph Tutorials! These notebooks introduce LangGraph through building various language agents and applications.
## Agent Executors
## AgentExecutor
- **Chat Agent (Function Calling)**
- [Base](chat_agent_executor_with_function_calling/base.ipynb): Implementing a chat agent executor with function calling
- [High-Level](chat_agent_executor_with_function_calling/high-level.ipynb): Using the high-level chat agent executor API
- [High-Level Tools](chat_agent_executor_with_function_calling/high-level-tools.ipynb): Integrating tools into the high-level chat agent executor
- **Modifications**
- [Human-in-the-Loop](chat_agent_executor_with_function_calling/human-in-the-loop.ipynb)
- [Force Tool First](chat_agent_executor_with_function_calling/force-calling-a-tool-first.ipynb)
- [Respond in Format](chat_agent_executor_with_function_calling/respond-in-format.ipynb)
- [Dynamic Direct Return](chat_agent_executor_with_function_calling/dynamically-returning-directly.ipynb)
- [Manage Agent Steps](chat_agent_executor_with_function_calling/managing-agent-steps.ipynb)
Learn to build a simple agent in LangGraph.
- **LangChain Agent**
- [Base](agent_executor/base.ipynb): Implementing an agent executor with Langchain agents
- [High-Level](agent_executor/high-level.ipynb): Using the high-level Langchain agent executor API
- **Modifications**
- [Human-in-the-Loop](agent_executor/human-in-the-loop.ipynb)
- [Force Tool First](agent_executor/force-calling-a-tool-first.ipynb)
- [Manage Agent Steps](agent_executor/managing-agent-steps.ipynb)
- [Base](agent_executor/base.ipynb): Learn to build a LangGraph agent "from scratch"
- [High-Level](agent_executor/high-level.ipynb): Learn to use the `create_agent_executor`
## Planning Agents
## Chat Agent Executor
- [Plan-and-Execute](plan-and-execute/plan-and-execute.ipynb): Implementing a basic planning and execution agent
- [Reasoning without Observation](rewoo/rewoo.ipynb): Reducing re-planning by saving observations as variables
- [LLMCompiler](llm-compiler/LLMCompiler.ipynb): Streaming and eagerly executing a DAG of tasks from a planner
Learn to build a simple chat agent executor, which is a basic graph with an agentic loop that also supports dialog with a user.
## Reflection & Critique
- [Base](chat_agent_executor_with_function_calling/base.ipynb): Build a chat agent executor with function calling
- [High-Level](chat_agent_executor_with_function_calling/high-level.ipynb): Using the high-level chat agent executor API
- [High-Level Tools](chat_agent_executor_with_function_calling/high-level-tools.ipynb): Integrating tools into the high-level chat agent executor
- [Basic Reflection](reflection/reflection.ipynb): Prompting the agent to reflect on and revise its outputs
- [Reflexion](reflexion/reflexion.ipynb): Critiquing missing and superfluous details to guide next steps
- [Language Agent Tree Search](lats/lats.ipynb): Using reflection and rewards to drive a tree search over agents
## Use cases
## Multi-Agent Systems
Learn from example implementations of graphs designed for specific scenarios and that implement common design patterns.
#### Chatbots
- [Customer Support](chatbots/customer-support.ipynb): Building a customer support chatbot
- [Info Gathering](chatbots/information-gather-prompting.ipynb): Building an information gathering chatbot
- [Code Assistant](code_assistant/langgraph_code_assistant.ipynb): Building a code analysis and generation assistant
- [Web Navigation](web-navigation/web_voyager.ipynb): Building an agent that can navigate and interact with websites
#### Multi-Agent Systems
- [Collaboration](multi_agent/multi-agent-collaboration.ipynb): Enabling two agents to collaborate on a task
- [Supervision](multi_agent/agent_supervisor.ipynb): Using an LLM to orchestrate and delegate to individual agents
- [Hierarchical Teams](multi_agent/hierarchical_agent_teams.ipynb): Orchestrating nested teams of agents to solve problems
## Research & QA
#### RAG
- [Adaptive RAG](rag/langgraph_adaptive_rag.ipynb)
- [Adaptive RAG using Cohere](rag/langgraph_adaptive_rag_cohere.ipynb)
- [Adaptive RAG using local models](rag/langgraph_adaptive_rag_local.ipynb)
- [Agentic RAG.ipynb](rag/langgraph_agentic_rag.ipynb)
- [Corrective RAG](rag/langgraph_crag.ipynb)
- [Corrective RAG with local models](rag/langgraph_crag_local.ipynb)
- [Self-RAG](rag/langgraph_self_rag.ipynb)
- [Self-RAG with local models](rag/langgraph_self_rag_local.ipynb)
- **Retrieval-Augmented Generation**
- [langgraph_adaptive_rag.ipynb](rag/langgraph_adaptive_rag.ipynb)
- [langgraph_adaptive_rag_cohere.ipynb](rag/langgraph_adaptive_rag_cohere.ipynb)
- [langgraph_adaptive_rag_local.ipynb](rag/langgraph_adaptive_rag_local.ipynb)
- [langgraph_agentic_rag.ipynb](rag/langgraph_agentic_rag.ipynb)
- [langgraph_crag.ipynb](rag/langgraph_crag.ipynb)
- [langgraph_crag_local.ipynb](rag/langgraph_crag_local.ipynb)
- [langgraph_self_rag.ipynb](rag/langgraph_self_rag.ipynb)
- [langgraph_self_rag_local.ipynb](rag/langgraph_self_rag_local.ipynb)
- [Web Research (STORM)](storm/storm.ipynb): Generating Wikipedia-like articles via research and multi-perspective QA
## Applications
- **Chatbots**
- [Customer Support](chatbots/customer-support.ipynb): Building a customer support chatbot
- [Info Gathering](chatbots/information-gather-prompting.ipynb): Building an information gathering chatbot
- [Code Assistant](code_assistant/langgraph_code_assistant.ipynb): Building a code analysis and generation assistant
- [Web Navigation](web-navigation/web_voyager.ipynb): Building an agent that can navigate and interact with websites
#### Planning Agents
## Evaluation & Analysis
- [Plan-and-Execute](plan-and-execute/plan-and-execute.ipynb): Implementing a basic planning and execution agent
- [Reasoning without Observation](rewoo/rewoo.ipynb): Reducing re-planning by saving observations as variables
- [LLMCompiler](llm-compiler/LLMCompiler.ipynb): Streaming and eagerly executing a DAG of tasks from a planner
- **Chatbot Evaluation via Simulation**
- [Agent-based](chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb): Evaluating chatbots via simulated user interactions
- [Dataset-based](chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb): Evaluating chatbots over a dialog dataset
#### Reflection & Critique
- [Basic Reflection](reflection/reflection.ipynb): Prompting the agent to reflect on and revise its outputs
- [Reflexion](reflexion/reflexion.ipynb): Critiquing missing and superfluous details to guide next steps
- [Language Agent Tree Search](lats/lats.ipynb): Using reflection and rewards to drive a tree search over agents
- [Self-Discovering Agent](self-discover/self-discover.ipynb): Analyzing an agent that learns about its own capabilities
#### Evaluation
- [Agent-based](chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb): Evaluating chatbots via simulated user interactions
- [Dataset-based](chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb): Evaluating chatbots in LangSmith over a dialog dataset
+83 -69
View File
@@ -4,8 +4,8 @@ site_url: https://langchain-ai.github.io/langgraph/
theme:
name: material
custom_dir: overrides
logo: static/img/brand/wordmark.png
favicon: static/img/brand/favicon.png
logo: static/wordmark.png
favicon: static/favicon.png
features:
- announce.dismiss
- content.action.edit
@@ -54,10 +54,25 @@ plugins:
- mkdocstrings:
handlers:
python:
import:
- https://docs.python.org/3/objects.inv
- https://api.python.langchain.com/en/latest/objects.inv
options:
members_order: source
allow_inspection: true
heading_level: 3
show_bases: true
summary: true
inherited_members: true
# merge_init_into_class: true
selection:
docstring_style: google
docstring_section_style: list
show_root_toc_entry: false
# show_signature_annotations: true
# show_symbol_type_heading: true
show_symbol_type_toc: true
signature_crossrefs: true
- mkdocs-jupyter:
ignore_h1_titles: true
execute: false
@@ -69,83 +84,82 @@ plugins:
nav:
- Home:
- 'index.md'
- Quick Start: quick_start.ipynb
- Concepts:
- 'concepts.md'
- "How-to Guides":
- Basics:
- State Management: how-tos/state-model.ipynb
- Tool Integration: how-tos/sql_example.ipynb
- Human-in-the-Loop: how-tos/human-in-the-loop.ipynb
- Performance:
- Async Execution: how-tos/async.ipynb
- Streaming Responses: how-tos/streaming-tokens.ipynb
- Graph Structure:
- Subgraphs: how-tos/subgraph.ipynb
- Branching: how-tos/branching.ipynb
- Development:
- Persistence: how-tos/persistence.ipynb
- Visualization: how-tos/visualization.ipynb
- Time Travel: how-tos/time-travel.ipynb
- Benchmarking: how-tos/swe-bench.ipynb
- Quick Start: how-tos/docs/quickstart.ipynb
- Tutorials:
- Agent Executors:
- Chat Agent (Function Calling):
- Base: tutorials/chat_agent_executor_with_function_calling/base.ipynb
- High-Level: tutorials/chat_agent_executor_with_function_calling/high-level.ipynb
- High-Level Tools: tutorials/chat_agent_executor_with_function_calling/high-level-tools.ipynb
- Modifications:
- Human-in-the-Loop: tutorials/chat_agent_executor_with_function_calling/human-in-the-loop.ipynb
- Force Tool First: tutorials/chat_agent_executor_with_function_calling/force-calling-a-tool-first.ipynb
- Respond in Format: tutorials/chat_agent_executor_with_function_calling/respond-in-format.ipynb
- Dynamic Direct Return: tutorials/chat_agent_executor_with_function_calling/dynamically-returning-directly.ipynb
- Manage Agent Steps: tutorials/chat_agent_executor_with_function_calling/managing-agent-steps.ipynb
- Langchain Agent:
- Base: tutorials/agent_executor/base.ipynb
- High-Level: tutorials/agent_executor/high-level.ipynb
- Modifications:
- Human-in-the-Loop: tutorials/agent_executor/human-in-the-loop.ipynb
- Force Tool First: tutorials/agent_executor/force-calling-a-tool-first.ipynb
- Manage Agent Steps: tutorials/agent_executor/managing-agent-steps.ipynb
- Planning Agents:
- Plan-and-Execute: tutorials/plan-and-execute/plan-and-execute.ipynb
- Reasoning w/o Observation: tutorials/rewoo/rewoo.ipynb
- LLMCompiler: tutorials/llm-compiler/LLMCompiler.ipynb
- Reflection & Critique:
- Basic Reflection: tutorials/reflection/reflection.ipynb
- Reflexion: tutorials/reflexion/reflexion.ipynb
- Language Agent Tree Search: tutorials/lats/lats.ipynb
- Multi-Agent Systems:
- Collaboration: tutorials/multi_agent/multi-agent-collaboration.ipynb
- Supervision: tutorials/multi_agent/agent_supervisor.ipynb
- Hierarchical Teams: tutorials/multi_agent/hierarchical_agent_teams.ipynb
- Research & QA:
- Web Research (STORM): tutorials/storm/storm.ipynb
- Retrieval-Augmented Generation:
- 'tutorials/index.md'
- Agent Executor:
- "Base": tutorials/agent_executor/base.ipynb
- "High-Level": tutorials/agent_executor/high-level.ipynb
- Chat Agent Executor:
- "Base": tutorials/chat_agent_executor_with_function_calling/base.ipynb
- "High-Level": tutorials/chat_agent_executor_with_function_calling/high-level.ipynb
- "Tool Node": tutorials/chat_agent_executor_with_function_calling/prebuilt-tool-node.ipynb
- "High-Level Tools": tutorials/chat_agent_executor_with_function_calling/high-level-tools.ipynb
- Use cases:
- Chatbots:
- Customer Support: tutorials/chatbots/customer-support.ipynb
- Info Gathering: tutorials/chatbots/information-gather-prompting.ipynb
- Code Assistant: tutorials/code_assistant/langgraph_code_assistant.ipynb
- Web Navigation: tutorials/web-navigation/web_voyager.ipynb
- Multi-Agent Systems:
- Collaboration: tutorials/multi_agent/multi-agent-collaboration.ipynb
- Supervision: tutorials/multi_agent/agent_supervisor.ipynb
- Hierarchical Teams: tutorials/multi_agent/hierarchical_agent_teams.ipynb
- RAG:
- tutorials/rag/langgraph_adaptive_rag.ipynb
- tutorials/rag/langgraph_adaptive_rag_cohere.ipynb
- tutorials/rag/langgraph_adaptive_rag_local.ipynb
- tutorials/rag/langgraph_agentic_rag.ipynb
- tutorials/rag/langgraph_agentic_rag.ipynb
- tutorials/rag/langgraph_crag.ipynb
- tutorials/rag/langgraph_crag_local.ipynb
- tutorials/rag/langgraph_self_rag.ipynb
- tutorials/rag/langgraph_self_rag.ipynb
- tutorials/rag/langgraph_self_rag_local.ipynb
- Applications:
- Chatbots:
- Customer Support: tutorials/chatbots/customer-support.ipynb
- Info Gathering: tutorials/chatbots/information-gather-prompting.ipynb
- Code Assistant: tutorials/code_assistant/langgraph_code_assistant.ipynb
- Web Navigation: tutorials/web-navigation/web_voyager.ipynb
- Evaluation & Analysis:
- Chatbot Eval via Sim:
- Agent-based: tutorials/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb
- Dataset-based: tutorials/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb
- Self-Discovering Agent: tutorials/self-discover/self-discover.ipynb
- Swarm: tutorials/gptswarm/swarm.ipynb
- Web Research (STORM): tutorials/storm/storm.ipynb
- Planning Agents:
- Plan-and-Execute: tutorials/plan-and-execute/plan-and-execute.ipynb
- Reasoning w/o Observation: tutorials/rewoo/rewoo.ipynb
- LLMCompiler: tutorials/llm-compiler/LLMCompiler.ipynb
- Reflection & Critique:
- Basic Reflection: tutorials/reflection/reflection.ipynb
- Reflexion: tutorials/reflexion/reflexion.ipynb
- Language Agent Tree Search: tutorials/lats/lats.ipynb
- Self-Discovering Agent: tutorials/self-discover/self-discover.ipynb
- Evaluation & Analysis:
- Chatbot Eval via Sim:
- Agent-based: tutorials/chatbot-simulation-evaluation/agent-simulation-evaluation.ipynb
- Dataset-based: tutorials/chatbot-simulation-evaluation/langsmith-agent-simulation-evaluation.ipynb
- "How-to Guides":
- 'how-tos/index.md'
- Core:
- "Quick Start": how-tos/docs/quickstart.ipynb
- "State Management": how-tos/state-model.ipynb
- "Async Execution": how-tos/async.ipynb
- "Streaming Responses": how-tos/streaming-tokens.ipynb
- "Human-in-the-Loop": how-tos/human-in-the-loop.ipynb
- "Persistence": how-tos/persistence.ipynb
- "Time Travel": how-tos/time-travel.ipynb
- "Visualization": how-tos/visualization.ipynb
- "Pydantic State": how-tos/state-model.ipynb
- "Subgraphs": how-tos/subgraph.ipynb
- "Branching": how-tos/branching.ipynb
- Chat Agent (Function Calling):
- Human-in-the-Loop: how-tos/chat_agent_executor_with_function_calling/human-in-the-loop.ipynb
- Force Tool First: how-tos/chat_agent_executor_with_function_calling/force-calling-a-tool-first.ipynb
- Respond in Format: how-tos/chat_agent_executor_with_function_calling/respond-in-format.ipynb
- Dynamic Direct Return: how-tos/chat_agent_executor_with_function_calling/dynamically-returning-directly.ipynb
- Manage Agent Steps: how-tos/chat_agent_executor_with_function_calling/managing-agent-steps.ipynb
- AgentExecutor:
- Human-in-the-Loop: how-tos/agent_executor/human-in-the-loop.ipynb
- Force Tool First: how-tos/agent_executor/force-calling-a-tool-first.ipynb
- Manage Agent Steps: how-tos/agent_executor/managing-agent-steps.ipynb
- Persistance:
- "Persistance in Postgres": how-tos/persistence_postgres.ipynb
- Reference:
- Graphs: reference/graphs.md
- Checkpointing: reference/checkpoints.md
- Prebuilt Components: reference/prebuilt_components.md
- Prebuilt Components: reference/prebuilt.md
markdown_extensions:
@@ -684,7 +684,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.8"
"version": "3.11.2"
}
},
"nbformat": 4,
+3 -181
View File
@@ -42,190 +42,12 @@
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"id": "53d1a740-9fea-4a6e-8f95-fb9dbf1c80a1",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Requirement already satisfied: langchain_community in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.0.27)\n",
"Collecting langchain_community\n",
" Downloading langchain_community-0.0.31-py3-none-any.whl.metadata (8.4 kB)\n",
"Requirement already satisfied: tiktoken in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.5.2)\n",
"Collecting tiktoken\n",
" Downloading tiktoken-0.6.0-cp311-cp311-macosx_11_0_arm64.whl.metadata (6.6 kB)\n",
"Requirement already satisfied: langchain-openai in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.0.2.post1)\n",
"Collecting langchain-openai\n",
" Downloading langchain_openai-0.1.1-py3-none-any.whl.metadata (2.5 kB)\n",
"Requirement already satisfied: langchain-cohere in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.1.0)\n",
"Requirement already satisfied: langchainhub in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.1.15)\n",
"Requirement already satisfied: chromadb in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.4.24)\n",
"Requirement already satisfied: langchain in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.1.11)\n",
"Collecting langchain\n",
" Downloading langchain-0.1.14-py3-none-any.whl.metadata (13 kB)\n",
"Requirement already satisfied: langgraph in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.0.30)\n",
"Collecting langgraph\n",
" Downloading langgraph-0.0.31-py3-none-any.whl.metadata (44 kB)\n",
"\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.8/44.8 kB\u001b[0m \u001b[31m782.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m1.0 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
"\u001b[?25hRequirement already satisfied: tavily-python in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (0.3.1)\n",
"Collecting tavily-python\n",
" Downloading tavily_python-0.3.3-py3-none-any.whl.metadata (4.4 kB)\n",
"Requirement already satisfied: PyYAML>=5.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (6.0.1)\n",
"Requirement already satisfied: SQLAlchemy<3,>=1.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (2.0.28)\n",
"Requirement already satisfied: aiohttp<4.0.0,>=3.8.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (3.9.3)\n",
"Requirement already satisfied: dataclasses-json<0.7,>=0.5.7 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (0.6.4)\n",
"Requirement already satisfied: langchain-core<0.2.0,>=0.1.37 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (0.1.38)\n",
"Requirement already satisfied: langsmith<0.2.0,>=0.1.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (0.1.23)\n",
"Requirement already satisfied: numpy<2,>=1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (1.26.4)\n",
"Requirement already satisfied: requests<3,>=2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (2.31.0)\n",
"Requirement already satisfied: tenacity<9.0.0,>=8.1.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain_community) (8.2.3)\n",
"Requirement already satisfied: regex>=2022.1.18 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from tiktoken) (2023.12.25)\n",
"Requirement already satisfied: openai<2.0.0,>=1.10.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain-openai) (1.13.3)\n",
"Requirement already satisfied: cohere<6.0.0,>=5.1.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain-cohere) (5.1.7)\n",
"Requirement already satisfied: types-requests<3.0.0.0,>=2.31.0.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchainhub) (2.31.0.20240311)\n",
"Requirement already satisfied: build>=1.0.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.2.1)\n",
"Requirement already satisfied: pydantic>=1.9 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (2.6.4)\n",
"Requirement already satisfied: chroma-hnswlib==0.7.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.7.3)\n",
"Requirement already satisfied: fastapi>=0.95.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.109.0)\n",
"Requirement already satisfied: uvicorn>=0.18.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.25.0)\n",
"Requirement already satisfied: posthog>=2.4.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (3.5.0)\n",
"Requirement already satisfied: typing-extensions>=4.5.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (4.10.0)\n",
"Requirement already satisfied: pulsar-client>=3.1.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (3.4.0)\n",
"Requirement already satisfied: onnxruntime>=1.14.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.17.1)\n",
"Requirement already satisfied: opentelemetry-api>=1.2.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.24.0)\n",
"Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.24.0)\n",
"Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.45b0)\n",
"Requirement already satisfied: opentelemetry-sdk>=1.2.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.24.0)\n",
"Requirement already satisfied: tokenizers>=0.13.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.15.2)\n",
"Requirement already satisfied: pypika>=0.48.9 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.48.9)\n",
"Requirement already satisfied: tqdm>=4.65.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (4.66.2)\n",
"Requirement already satisfied: overrides>=7.3.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (7.7.0)\n",
"Requirement already satisfied: importlib-resources in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (6.4.0)\n",
"Requirement already satisfied: grpcio>=1.58.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (1.62.1)\n",
"Requirement already satisfied: bcrypt>=4.0.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (4.1.2)\n",
"Requirement already satisfied: typer>=0.9.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (0.12.0)\n",
"Requirement already satisfied: kubernetes>=28.1.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (29.0.0)\n",
"Requirement already satisfied: mmh3>=4.0.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (4.1.0)\n",
"Requirement already satisfied: orjson>=3.9.12 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from chromadb) (3.9.15)\n",
"Requirement already satisfied: jsonpatch<2.0,>=1.33 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain) (1.33)\n",
"Requirement already satisfied: langchain-text-splitters<0.1,>=0.0.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from langchain) (0.0.1)\n",
"Requirement already satisfied: aiosignal>=1.1.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.3.1)\n",
"Requirement already satisfied: attrs>=17.3.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (23.2.0)\n",
"Requirement already satisfied: frozenlist>=1.1.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.4.1)\n",
"Requirement already satisfied: multidict<7.0,>=4.5 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (6.0.5)\n",
"Requirement already satisfied: yarl<2.0,>=1.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from aiohttp<4.0.0,>=3.8.3->langchain_community) (1.9.4)\n",
"Requirement already satisfied: packaging>=19.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from build>=1.0.3->chromadb) (23.2)\n",
"Requirement already satisfied: pyproject_hooks in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from build>=1.0.3->chromadb) (1.0.0)\n",
"Requirement already satisfied: fastavro<2.0.0,>=1.9.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from cohere<6.0.0,>=5.1.4->langchain-cohere) (1.9.4)\n",
"Requirement already satisfied: httpx>=0.21.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from cohere<6.0.0,>=5.1.4->langchain-cohere) (0.26.0)\n",
"Requirement already satisfied: marshmallow<4.0.0,>=3.18.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from dataclasses-json<0.7,>=0.5.7->langchain_community) (3.21.1)\n",
"Requirement already satisfied: typing-inspect<1,>=0.4.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from dataclasses-json<0.7,>=0.5.7->langchain_community) (0.9.0)\n",
"Requirement already satisfied: starlette<0.36.0,>=0.35.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from fastapi>=0.95.2->chromadb) (0.35.1)\n",
"Requirement already satisfied: jsonpointer>=1.9 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from jsonpatch<2.0,>=1.33->langchain) (2.4)\n",
"Requirement already satisfied: certifi>=14.05.14 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (2024.2.2)\n",
"Requirement already satisfied: six>=1.9.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (1.16.0)\n",
"Requirement already satisfied: python-dateutil>=2.5.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (2.9.0.post0)\n",
"Requirement already satisfied: google-auth>=1.0.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (2.29.0)\n",
"Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (1.7.0)\n",
"Requirement already satisfied: requests-oauthlib in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (2.0.0)\n",
"Requirement already satisfied: oauthlib>=3.2.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n",
"Requirement already satisfied: urllib3>=1.24.2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb) (2.2.1)\n",
"Requirement already satisfied: coloredlogs in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n",
"Requirement already satisfied: flatbuffers in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from onnxruntime>=1.14.1->chromadb) (24.3.25)\n",
"Requirement already satisfied: protobuf in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from onnxruntime>=1.14.1->chromadb) (4.25.3)\n",
"Requirement already satisfied: sympy in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from onnxruntime>=1.14.1->chromadb) (1.12)\n",
"Requirement already satisfied: anyio<5,>=3.5.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.10.0->langchain-openai) (4.3.0)\n",
"Requirement already satisfied: distro<2,>=1.7.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.10.0->langchain-openai) (1.9.0)\n",
"Requirement already satisfied: sniffio in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from openai<2.0.0,>=1.10.0->langchain-openai) (1.3.1)\n",
"Requirement already satisfied: deprecated>=1.2.6 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.14)\n",
"Requirement already satisfied: importlib-metadata<=7.0,>=6.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-api>=1.2.0->chromadb) (7.0.0)\n",
"Requirement already satisfied: googleapis-common-protos~=1.52 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.63.0)\n",
"Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.24.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.24.0)\n",
"Requirement already satisfied: opentelemetry-proto==1.24.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.24.0)\n",
"Requirement already satisfied: opentelemetry-instrumentation-asgi==0.45b0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.45b0)\n",
"Requirement already satisfied: opentelemetry-instrumentation==0.45b0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.45b0)\n",
"Requirement already satisfied: opentelemetry-semantic-conventions==0.45b0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.45b0)\n",
"Requirement already satisfied: opentelemetry-util-http==0.45b0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.45b0)\n",
"Requirement already satisfied: setuptools>=16.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation==0.45b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (69.0.2)\n",
"Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation==0.45b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.16.0)\n",
"Requirement already satisfied: asgiref~=3.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from opentelemetry-instrumentation-asgi==0.45b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.8.1)\n",
"Requirement already satisfied: monotonic>=1.5 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from posthog>=2.4.0->chromadb) (1.6)\n",
"Requirement already satisfied: backoff>=1.10.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from posthog>=2.4.0->chromadb) (2.2.1)\n",
"Requirement already satisfied: annotated-types>=0.4.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from pydantic>=1.9->chromadb) (0.6.0)\n",
"Requirement already satisfied: pydantic-core==2.16.3 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from pydantic>=1.9->chromadb) (2.16.3)\n",
"Requirement already satisfied: charset-normalizer<4,>=2 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from requests<3,>=2->langchain_community) (3.3.2)\n",
"Requirement already satisfied: idna<4,>=2.5 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from requests<3,>=2->langchain_community) (3.6)\n",
"Requirement already satisfied: huggingface_hub<1.0,>=0.16.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from tokenizers>=0.13.2->chromadb) (0.22.1)\n",
"Requirement already satisfied: typer-slim==0.12.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (0.12.0)\n",
"Requirement already satisfied: typer-cli==0.12.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typer>=0.9.0->chromadb) (0.12.0)\n",
"Requirement already satisfied: click>=8.0.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typer-slim==0.12.0->typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (8.1.7)\n",
"Requirement already satisfied: shellingham>=1.3.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (1.5.4)\n",
"Requirement already satisfied: rich>=10.11.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (13.7.1)\n",
"Requirement already satisfied: h11>=0.8 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn>=0.18.3->uvicorn[standard]>=0.18.3->chromadb) (0.14.0)\n",
"Requirement already satisfied: httptools>=0.5.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.1)\n",
"Requirement already satisfied: python-dotenv>=0.13 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.1)\n",
"Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.19.0)\n",
"Requirement already satisfied: watchfiles>=0.13 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.21.0)\n",
"Requirement already satisfied: websockets>=10.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (12.0)\n",
"Requirement already satisfied: cachetools<6.0,>=2.0.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.3.3)\n",
"Requirement already satisfied: pyasn1-modules>=0.2.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.4.0)\n",
"Requirement already satisfied: rsa<5,>=3.1.4 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n",
"Requirement already satisfied: httpcore==1.* in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from httpx>=0.21.2->cohere<6.0.0,>=5.1.4->langchain-cohere) (1.0.4)\n",
"Requirement already satisfied: filelock in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (3.13.3)\n",
"Requirement already satisfied: fsspec>=2023.5.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (2024.3.1)\n",
"Requirement already satisfied: zipp>=0.5 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from importlib-metadata<=7.0,>=6.0->opentelemetry-api>=1.2.0->chromadb) (3.18.1)\n",
"Requirement already satisfied: mypy-extensions>=0.3.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from typing-inspect<1,>=0.4.0->dataclasses-json<0.7,>=0.5.7->langchain_community) (1.0.0)\n",
"Requirement already satisfied: humanfriendly>=9.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n",
"Requirement already satisfied: mpmath>=0.19 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n",
"Requirement already satisfied: pyasn1<0.7.0,>=0.4.6 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.6.0)\n",
"Requirement already satisfied: markdown-it-py>=2.2.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from rich>=10.11.0->typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (3.0.0)\n",
"Requirement already satisfied: pygments<3.0.0,>=2.13.0 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from rich>=10.11.0->typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (2.17.2)\n",
"Requirement already satisfied: mdurl~=0.1 in /Users/nuno/dev/langgraph/.venv/lib/python3.11/site-packages (from markdown-it-py>=2.2.0->rich>=10.11.0->typer-slim[standard]==0.12.0->typer>=0.9.0->chromadb) (0.1.2)\n",
"Downloading langchain_community-0.0.31-py3-none-any.whl (1.9 MB)\n",
"\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.9/1.9 MB\u001b[0m \u001b[31m9.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m[31m10.3 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
"\u001b[?25hDownloading tiktoken-0.6.0-cp311-cp311-macosx_11_0_arm64.whl (949 kB)\n",
"\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m949.8/949.8 kB\u001b[0m \u001b[31m15.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
"\u001b[?25hDownloading langchain_openai-0.1.1-py3-none-any.whl (32 kB)\n",
"Downloading langchain-0.1.14-py3-none-any.whl (812 kB)\n",
"\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m812.8/812.8 kB\u001b[0m \u001b[31m14.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m MB/s\u001b[0m eta \u001b[36m0:00:01\u001b[0m\n",
"\u001b[?25hDownloading langgraph-0.0.31-py3-none-any.whl (55 kB)\n",
"\u001b[2K \u001b[38;2;114;156;31m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m55.5/55.5 kB\u001b[0m \u001b[31m4.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
"\u001b[?25hDownloading tavily_python-0.3.3-py3-none-any.whl (5.4 kB)\n",
"Installing collected packages: tiktoken, tavily-python, langgraph, langchain-openai, langchain_community, langchain\n",
" Attempting uninstall: tiktoken\n",
" Found existing installation: tiktoken 0.5.2\n",
" Uninstalling tiktoken-0.5.2:\n",
" Successfully uninstalled tiktoken-0.5.2\n",
" Attempting uninstall: tavily-python\n",
" Found existing installation: tavily-python 0.3.1\n",
" Uninstalling tavily-python-0.3.1:\n",
" Successfully uninstalled tavily-python-0.3.1\n",
" Attempting uninstall: langgraph\n",
" Found existing installation: langgraph 0.0.30\n",
" Uninstalling langgraph-0.0.30:\n",
" Successfully uninstalled langgraph-0.0.30\n",
" Attempting uninstall: langchain-openai\n",
" Found existing installation: langchain-openai 0.0.2.post1\n",
" Uninstalling langchain-openai-0.0.2.post1:\n",
" Successfully uninstalled langchain-openai-0.0.2.post1\n",
" Attempting uninstall: langchain_community\n",
" Found existing installation: langchain-community 0.0.27\n",
" Uninstalling langchain-community-0.0.27:\n",
" Successfully uninstalled langchain-community-0.0.27\n",
" Attempting uninstall: langchain\n",
" Found existing installation: langchain 0.1.11\n",
" Uninstalling langchain-0.1.11:\n",
" Successfully uninstalled langchain-0.1.11\n",
"Successfully installed langchain-0.1.14 langchain-openai-0.1.1 langchain_community-0.0.31 langgraph-0.0.31 tavily-python-0.3.3 tiktoken-0.6.0\n",
"\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.3.1\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m24.0\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n"
]
}
],
"outputs": [],
"source": [
"%%capture --no-stderr\n",
"! pip install -U langchain_community tiktoken langchain-openai langchain-cohere langchainhub chromadb langchain langgraph tavily-python"
]
},
+4
View File
@@ -69,8 +69,12 @@ def copy_checkpoint(checkpoint: Checkpoint) -> Checkpoint:
class CheckpointAt(StrEnum):
"""When to take a checkpoint."""
END_OF_STEP = "end_of_step"
"""Take a checkpoint at the end of each step."""
END_OF_RUN = "end_of_run"
"""Take a checkpoint at the end of the run."""
class CheckpointTuple(NamedTuple):
+45
View File
@@ -153,6 +153,24 @@ class Graph:
],
conditional_edge_mapping: Optional[dict[str, str]] = None,
) -> None:
"""Add a conditional edge from the starting node to any number of destination nodes.
Args:
start_key (str): The key of the starting node.
condition (Union[Callable, Runnable]): The condition that determines the destination of the edge.
conditional_edge_mapping (Optional[dict[str, str]]): A dictionary that maps the response of the condition to a name of
the destination node(s). If the condition returns a list, the response will be matched against the keys of the
dictionary. If the condition returns a string, the response will be matched against the values of the dictionary.
If the condition returns a string and the dictionary contains a key with the value of `END` ("__end__"`),
the graph will finish.
Raises:
ValueError: If the starting node is not found in the graph or if the conditional edge mapping contains missing nodes.
Returns:
None
""" # noqa: E501
if self.compiled:
logger.warning(
"Adding an edge to a graph that has already been compiled. This will "
@@ -182,6 +200,14 @@ class Graph:
self.branches[start_key][name] = Branch(condition, conditional_edge_mapping)
def set_entry_point(self, key: str) -> None:
"""Specifies the first node to be called in the graph.
Parameters:
key (str): The key of the node to set as the entry point.
Returns:
None
"""
return self.add_edge(START, key)
def set_conditional_entry_point(
@@ -191,9 +217,28 @@ class Graph:
],
conditional_edge_mapping: Optional[Dict[str, str]] = None,
) -> None:
"""Sets a conditional entry point in the graph.
Args:
condition: A callable object that takes any number of arguments and returns a string or an awaitable string.
conditional_edge_mapping: A dictionary that maps condition names to edge names.
Returns:
None
"""
return self.add_conditional_edges(START, condition, conditional_edge_mapping)
def set_finish_point(self, key: str) -> None:
"""Marks a node as a finish point of the graph.
If the graph reaches this node, it will cease execution.
Parameters:
key (str): The key of the node to set as the finish point.
Returns:
None
"""
return self.add_edge(key, END)
def validate(self, interrupt: Optional[Sequence[str]] = None) -> None:
+43 -4
View File
@@ -45,11 +45,37 @@ class StateGraph(Graph):
}
def add_node(self, key: str, action: RunnableLike) -> None:
"""Adds a new node to the state graph.
Args:
key (str): The key of the node.
action (RunnableLike): The action associated with the node.
Raises:
ValueError: If the key is already being used as a state key.
Returns:
None
"""
if key in self.channels:
raise ValueError(f"'{key}' is already being used as a state key")
return super().add_node(key, action)
def add_edge(self, start_key: Union[str, list[str]], end_key: str) -> None:
"""Adds a directed edge from the start node to the end node.
If the graph transitions to the start_key node, it will always transition to the end_key node next.
Args:
start_key (Union[str, list[str]]): The key(s) of the start node(s) of the edge.
end_key (str): The key of the end node of the edge.
Raises:
ValueError: If the start key is 'END' or if the start key or end key is not present in the graph.
Returns:
None
"""
if isinstance(start_key, str):
return super().add_edge(start_key, end_key)
@@ -77,6 +103,17 @@ class StateGraph(Graph):
interrupt_after: Optional[Sequence[str]] = None,
debug: bool = False,
) -> CompiledGraph:
"""Compiles the state graph into a `CompiledGraph` object.
Args:
checkpointer (Optional[BaseCheckpointSaver]): An optional checkpoint saver object.
interrupt_before (Optional[Sequence[str]]): An optional list of node names to interrupt before.
interrupt_after (Optional[Sequence[str]]): An optional list of node names to interrupt after.
debug (bool): A flag indicating whether to enable debug mode.
Returns:
CompiledGraph: The compiled state graph.
"""
# assign default values
interrupt_before = interrupt_before or []
interrupt_after = interrupt_after or []
@@ -135,10 +172,12 @@ class CompiledStateGraph(CompiledGraph):
state_keys = list(self.graph.channels)
# state updaters
state_write_entries = [
ChannelWriteEntry(key, None, skip_none=True)
if key == "__root__"
else ChannelWriteEntry(
key, RunnableCallable(_get_state_key, key=key, trace=False)
(
ChannelWriteEntry(key, None, skip_none=True)
if key == "__root__"
else ChannelWriteEntry(
key, RunnableCallable(_get_state_key, key=key, trace=False)
)
)
for key in state_keys
]
+42 -1
View File
@@ -5,6 +5,7 @@ from langchain_core.agents import AgentAction, AgentFinish
from langchain_core.messages import BaseMessage
from langgraph.graph import END, StateGraph
from langgraph.graph.state import CompiledStateGraph
from langgraph.prebuilt.tool_executor import ToolExecutor
from langgraph.utils import RunnableCallable
@@ -39,7 +40,47 @@ def _get_agent_state(input_schema=None):
return AgentState
def create_agent_executor(agent_runnable, tools, input_schema=None):
def create_agent_executor(
agent_runnable, tools, input_schema=None
) -> CompiledStateGraph:
"""This is a helper function for creating a graph that works with LangChain Agents.
Args:
agent_runnable (RunnableLike): The agent runnable.
tools (list): A list of tools to be used by the agent.
input_schema (dict, optional): The input schema for the agent. Defaults to None.
Returns:
The `CompiledStateGraph` object.
Examples:
from langgraph.prebuilt import create_agent_executor
from langchain_openai import ChatOpenAI
from langchain import hub
from langchain.agents import create_openai_functions_agent
from langchain_community.tools.tavily_search import TavilySearchResults
tools = [TavilySearchResults(max_results=1)]
# Get the prompt to use - you can modify this!
prompt = hub.pull("hwchase17/openai-functions-agent")
# Choose the LLM that will drive the agent
llm = ChatOpenAI(model="gpt-3.5-turbo-1106")
# Construct the OpenAI Functions agent
agent_runnable = create_openai_functions_agent(llm, tools, prompt)
app = create_agent_executor(agent_runnable, tools)
inputs = {"input": "what is the weather in sf", "chat_history": []}
for s in app.stream(inputs):
print(list(s.values())[0])
print("----")
"""
if isinstance(tools, ToolExecutor):
tool_executor = tools
else:
+31 -2
View File
@@ -8,6 +8,7 @@ from langchain_core.tools import BaseTool
from langchain_core.utils.function_calling import convert_to_openai_function
from langgraph.graph import END, StateGraph
from langgraph.graph.graph import CompiledGraph
from langgraph.graph.message import add_messages
from langgraph.prebuilt.tool_executor import ToolExecutor, ToolInvocation
from langgraph.prebuilt.tool_node import ToolNode
@@ -18,12 +19,14 @@ from langgraph.prebuilt.tool_node import ToolNode
# We want steps to return messages to append to the list
# So we annotate the messages attribute with operator.add
class AgentState(TypedDict):
"""The state of the agent."""
messages: Annotated[Sequence[BaseMessage], add_messages]
def create_function_calling_executor(
model: LanguageModelLike, tools: Union[ToolExecutor, Sequence[BaseTool]]
):
) -> CompiledGraph:
if isinstance(tools, ToolExecutor):
tool_executor = tools
tool_classes = tools.tools
@@ -132,7 +135,33 @@ def create_function_calling_executor(
def create_tool_calling_executor(
model: LanguageModelLike, tools: Union[ToolExecutor, Sequence[BaseTool]]
):
) -> CompiledGraph:
"""Creates a graph that works with a chat model that utilizes tool calling.
Args:
model (LanguageModelLike): The chat model that supports OpenAI tool calling.
tools (Union[ToolExecutor, Sequence[BaseTool]]): A list of tools or a ToolExecutor instance.
Returns:
Runnable: A compiled LangChain runnable that can be used for chat interactions.
Examples:
from langgraph.prebuilt import chat_agent_executor
from langchain_openai import ChatOpenAI
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_core.messages import HumanMessage
tools = [TavilySearchResults(max_results=1)]
model = ChatOpenAI()
app = chat_agent_executor.create_tool_calling_executor(model, tools)
inputs = {"messages": [HumanMessage(content="what is the weather in sf")]}
for s in app.stream(inputs):
print(list(s.values())[0])
print("----")
"""
if isinstance(tools, ToolExecutor):
tool_classes = tools.tools
else:
+40
View File
@@ -303,6 +303,7 @@ class Pregel(
)
def get_state(self, config: RunnableConfig) -> StateSnapshot:
"""Get the current state of the graph."""
if not self.checkpointer:
raise ValueError("No checkpointer set")
@@ -323,6 +324,7 @@ class Pregel(
)
async def aget_state(self, config: RunnableConfig) -> StateSnapshot:
"""Get the current state of the graph."""
if not self.checkpointer:
raise ValueError("No checkpointer set")
@@ -343,6 +345,7 @@ class Pregel(
)
def get_state_history(self, config: RunnableConfig) -> Iterator[StateSnapshot]:
"""Get the history of the state of the graph."""
if not self.checkpointer:
raise ValueError("No checkpointer set")
@@ -364,6 +367,7 @@ class Pregel(
async def aget_state_history(
self, config: RunnableConfig
) -> AsyncIterator[StateSnapshot]:
"""Get the history of the state of the graph."""
if not self.checkpointer:
raise ValueError("No checkpointer set")
@@ -559,6 +563,7 @@ class Pregel(
interrupt_after_nodes: Optional[Sequence[str]] = None,
debug: Optional[bool] = None,
) -> Iterator[Union[dict[str, Any], Any]]:
"""Stream graph steps for a single input."""
config = ensure_config(config)
callback_manager = get_callback_manager_for_config(config)
run_manager = callback_manager.on_chain_start(
@@ -970,6 +975,23 @@ class Pregel(
debug: Optional[bool] = None,
**kwargs: Any,
) -> Union[dict[str, Any], Any]:
"""Run the graph with a single input and config.
Args:
input: The input data for the graph. It can be a dictionary or any other type.
config: Optional. The configuration for the graph run.
stream_mode: Optional[str]. The stream mode for the graph run. Default is "values".
output_keys: Optional. The output keys to retrieve from the graph run.
input_keys: Optional. The input keys to provide for the graph run.
interrupt_before_nodes: Optional. The nodes to interrupt the graph run before.
interrupt_after_nodes: Optional. The nodes to interrupt the graph run after.
debug: Optional. Enable debug mode for the graph run.
**kwargs: Additional keyword arguments to pass to the graph run.
Returns:
The output of the graph run. If stream_mode is "values", it returns the latest output.
If stream_mode is not "values", it returns a list of output chunks.
"""
output_keys = output_keys if output_keys is not None else self.output_channels
if stream_mode == "values":
latest: Union[dict[str, Any], Any] = None
@@ -1008,6 +1030,24 @@ class Pregel(
debug: Optional[bool] = None,
**kwargs: Any,
) -> Union[dict[str, Any], Any]:
"""Asynchronously invoke the graph on a single input.
Args:
input: The input data for the computation. It can be a dictionary or any other type.
config: Optional. The configuration for the computation.
stream_mode: Optional. The stream mode for the computation. Default is "values".
output_keys: Optional. The output keys to include in the result. Default is None.
input_keys: Optional. The input keys to include in the result. Default is None.
interrupt_before_nodes: Optional. The nodes to interrupt before. Default is None.
interrupt_after_nodes: Optional. The nodes to interrupt after. Default is None.
debug: Optional. Whether to enable debug mode. Default is None.
**kwargs: Additional keyword arguments.
Returns:
The result of the computation. If stream_mode is "values", it returns the latest value.
If stream_mode is "chunks", it returns a list of chunks.
"""
output_keys = output_keys if output_keys is not None else self.output_channels
if stream_mode == "values":
latest: Union[dict[str, Any], Any] = None