langchain
4d118777 - feat(langchain): dynamic system prompt middleware (#33006)

Commit
224 days ago
feat(langchain): dynamic system prompt middleware (#33006) # Changes ## Adds support for `DynamicSystemPromptMiddleware` ```py from langchain.agents.middleware import DynamicSystemPromptMiddleware from langgraph.runtime import Runtime from typing_extensions import TypedDict class Context(TypedDict): user_name: str def system_prompt(state: AgentState, runtime: Runtime[Context]) -> str: user_name = runtime.context.get("user_name", "n/a") return f"You are a helpful assistant. Always address the user by their name: {user_name}" middleware = DynamicSystemPromptMiddleware(system_prompt) ``` ## Adds support for `runtime` in middleware hooks ```py class AgentMiddleware(Generic[StateT, ContextT]): def modify_model_request( self, request: ModelRequest, state: StateT, runtime: Runtime[ContextT], # Optional runtime parameter ) -> ModelRequest: # upgrade model if runtime.context.subscription is `top-tier` or whatever ``` ## Adds support for omitting state attributes from input / output schemas ```py from typing import Annotated, NotRequired from langchain.agents.middleware.types import PrivateStateAttr, OmitFromInput, OmitFromOutput class CustomState(AgentState): # Private field - not in input or output schemas internal_counter: NotRequired[Annotated[int, PrivateStateAttr]] # Input-only field - not in output schema user_input: NotRequired[Annotated[str, OmitFromOutput]] # Output-only field - not in input schema computed_result: NotRequired[Annotated[str, OmitFromInput]] ``` ## Additionally * Removes filtering of state before passing into middleware hooks Typing is not foolproof here, still need to figure out some of the generics stuff w/ state and context schema extensions for middleware. TODO: * More docs for middleware, should hold off on this until other prios like MCP and deepagents are met --------- Co-authored-by: Eugene Yurtsev <eyurtsev@gmail.com>
Author
Parents
Loading