feat: upgrade LangGraph to 1.x and migrate deprecated APIs

- Bump langgraph from 0.4 to 1.0+, langgraph-supervisor from 0.0.12 to 0.0.30+
- Bump langchain-core, langchain-anthropic, langchain-openai to 1.x
- Add langchain>=1.0 dependency for new create_agent location
- Migrate create_react_agent -> create_agent (prompt -> system_prompt)
- Fix create_supervisor positional arg to named agents= parameter
- Replace AsyncMock checkpointer with InMemorySaver in tests (v1 type validation)
- Update version references in README, ARCHITECTURE, eng-review-plan
This commit is contained in:
Yaojia Wang
2026-04-06 14:51:51 +02:00
parent be5c84bcff
commit b8654aa31f
6 changed files with 22 additions and 20 deletions

View File

@@ -5,7 +5,7 @@ from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from langgraph.prebuilt import create_react_agent
from langchain.agents import create_agent
from langgraph_supervisor import create_supervisor
from app.agents import get_tools_by_names
@@ -59,11 +59,11 @@ def build_agent_nodes(
f"Permission level: {agent_config.permission}."
)
agent_node = create_react_agent(
agent_node = create_agent(
model=llm,
tools=tools,
name=agent_config.name,
prompt=system_prompt,
system_prompt=system_prompt,
)
agent_nodes.append(agent_node)
@@ -88,7 +88,7 @@ def build_graph(
prompt = SUPERVISOR_PROMPT.format(agent_descriptions=agent_descriptions)
workflow = create_supervisor(
agent_nodes,
agents=agent_nodes,
model=llm,
prompt=prompt,
output_mode="full_history",

View File

@@ -6,12 +6,13 @@ requires-python = ">=3.11"
dependencies = [
"fastapi>=0.115,<1.0",
"uvicorn[standard]>=0.34,<1.0",
"langgraph>=0.4,<1.0",
"langgraph-supervisor>=0.0.12,<1.0",
"langgraph>=1.0,<2.0",
"langgraph-supervisor>=0.0.30,<1.0",
"langgraph-checkpoint-postgres>=3.0,<4.0",
"langchain-core>=0.3,<1.0",
"langchain-anthropic>=0.3,<2.0",
"langchain-openai>=0.3,<1.0",
"langchain>=1.0,<2.0",
"langchain-core>=1.0,<2.0",
"langchain-anthropic>=1.0,<2.0",
"langchain-openai>=1.0,<2.0",
"langchain-google-genai>=2.1,<3.0",
"psycopg[binary,pool]>=3.2,<4.0",
"pydantic>=2.10,<3.0",

View File

@@ -6,6 +6,7 @@ from typing import TYPE_CHECKING
from unittest.mock import AsyncMock, MagicMock
import pytest
from langgraph.checkpoint.memory import InMemorySaver
from app.graph import build_agent_nodes, build_graph, classify_intent
from app.intent import ClassificationResult, IntentTarget
@@ -34,20 +35,20 @@ class TestBuildGraph:
mock_llm = MagicMock()
mock_llm.bind_tools = MagicMock(return_value=mock_llm)
mock_llm.with_structured_output = MagicMock(return_value=mock_llm)
mock_checkpointer = AsyncMock()
checkpointer = InMemorySaver()
graph = build_graph(sample_registry, mock_llm, mock_checkpointer)
graph = build_graph(sample_registry, mock_llm, checkpointer)
assert graph is not None
def test_graph_has_classifier_attached(self, sample_registry: AgentRegistry) -> None:
mock_llm = MagicMock()
mock_llm.bind_tools = MagicMock(return_value=mock_llm)
mock_llm.with_structured_output = MagicMock(return_value=mock_llm)
mock_checkpointer = AsyncMock()
checkpointer = InMemorySaver()
mock_classifier = MagicMock()
graph = build_graph(
sample_registry, mock_llm, mock_checkpointer, intent_classifier=mock_classifier
sample_registry, mock_llm, checkpointer, intent_classifier=mock_classifier
)
assert graph.intent_classifier is mock_classifier
assert graph.agent_registry is sample_registry
@@ -56,9 +57,9 @@ class TestBuildGraph:
mock_llm = MagicMock()
mock_llm.bind_tools = MagicMock(return_value=mock_llm)
mock_llm.with_structured_output = MagicMock(return_value=mock_llm)
mock_checkpointer = AsyncMock()
checkpointer = InMemorySaver()
graph = build_graph(sample_registry, mock_llm, mock_checkpointer)
graph = build_graph(sample_registry, mock_llm, checkpointer)
assert graph.intent_classifier is None