From ef360465485bd4178859f9a2650300cf9b4b3610 Mon Sep 17 00:00:00 2001 From: Mahmut CAVDAR <4072246+mcavdar@users.noreply.github.com> Date: Mon, 27 Oct 2025 12:05:17 +0100 Subject: [PATCH 1/4] Replace ModelRequestHandler with Callable[[ModelRequest], ModelResponse] --- src/oss/python/migrate/langchain-v1.mdx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/oss/python/migrate/langchain-v1.mdx b/src/oss/python/migrate/langchain-v1.mdx index 4b4191c7a7..ec3c70933d 100644 --- a/src/oss/python/migrate/langchain-v1.mdx +++ b/src/oss/python/migrate/langchain-v1.mdx @@ -492,24 +492,24 @@ This functionality has been ported to the middleware interface in v1. ```python v1 (new) from langchain.agents import create_agent from langchain.agents.middleware import ( - AgentMiddleware, ModelRequest, ModelRequestHandler + AgentMiddleware, ModelRequest ) -from langchain.messages import AIMessage +from langchain.agents.middleware.types import ModelResponse from langchain_openai import ChatOpenAI - +from typing import Callable basic_model = ChatOpenAI(model="gpt-5-nano") advanced_model = ChatOpenAI(model="gpt-5") class DynamicModelMiddleware(AgentMiddleware): - def wrap_model_call(self, request: ModelRequest, handler: ModelRequestHandler) -> AIMessage: + def wrap_model_call(self, request: ModelRequest, handler: Callable[[ModelRequest], ModelResponse]) -> ModelResponse: if len(request.state.messages) > self.messages_threshold: model = advanced_model else: model = basic_model - - return handler(request.replace(model=model)) + request.model = model + return handler(request) def __init__(self, messages_threshold: int) -> None: self.messages_threshold = messages_threshold From 59a4ae6ab56a3f94f73b66273baecd8538a1ca21 Mon Sep 17 00:00:00 2001 From: Mason Daugherty Date: Mon, 27 Oct 2025 17:01:39 -0400 Subject: [PATCH 2/4] fix --- src/oss/python/migrate/langchain-v1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/oss/python/migrate/langchain-v1.mdx b/src/oss/python/migrate/langchain-v1.mdx index ec3c70933d..5f8e5cfc4e 100644 --- a/src/oss/python/migrate/langchain-v1.mdx +++ b/src/oss/python/migrate/langchain-v1.mdx @@ -368,7 +368,7 @@ class CustomState(AgentState): @tool # [!code highlight] def greet( - runtime: ToolRuntime[CustomState] + runtime: ToolRuntime[None, CustomState] ) -> str: """Use this to greet the user by name.""" user_name = runtime.state.get("user_name", "Unknown") # [!code highlight] From c0f11e90c5964a70b9890eed7a642f190b90be11 Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Thu, 6 Nov 2025 16:58:39 -0500 Subject: [PATCH 3/4] Update src/oss/python/migrate/langchain-v1.mdx --- src/oss/python/migrate/langchain-v1.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/oss/python/migrate/langchain-v1.mdx b/src/oss/python/migrate/langchain-v1.mdx index 992e0e2b5f..d712ab0f4d 100644 --- a/src/oss/python/migrate/langchain-v1.mdx +++ b/src/oss/python/migrate/langchain-v1.mdx @@ -505,7 +505,7 @@ class DynamicModelMiddleware(AgentMiddleware): else: model = basic_model request.model = model - return handler(request) + return handler(request.override(model=model)) def __init__(self, messages_threshold: int) -> None: self.messages_threshold = messages_threshold From 17e00654d3ecb3df0fb358a0b51825e9888439ba Mon Sep 17 00:00:00 2001 From: Sydney Runkle <54324534+sydney-runkle@users.noreply.github.com> Date: Thu, 6 Nov 2025 16:59:02 -0500 Subject: [PATCH 4/4] Update src/oss/python/migrate/langchain-v1.mdx --- src/oss/python/migrate/langchain-v1.mdx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/oss/python/migrate/langchain-v1.mdx b/src/oss/python/migrate/langchain-v1.mdx index d712ab0f4d..001d5c76fe 100644 --- a/src/oss/python/migrate/langchain-v1.mdx +++ b/src/oss/python/migrate/langchain-v1.mdx @@ -504,7 +504,6 @@ class DynamicModelMiddleware(AgentMiddleware): model = advanced_model else: model = basic_model - request.model = model return handler(request.override(model=model)) def __init__(self, messages_threshold: int) -> None: