# Dynamic prompts

```python
from dataclasses import dataclass
from langchain.agents import create_agent
from langchain.agents.middleware import dynamic_prompt, ModelRequest

@dataclass
class Context:
    user_role: str = "user"

@dynamic_prompt
def my_prompt(request: ModelRequest) -> str:
    base = "You are a helpful assistant."
    if request.runtime.context.user_role == "expert":
        return base + " Provide detailed technical responses."
    return base + " Explain concepts simply and avoid jargon."

agent = create_agent(
    model="gpt-5.5",
    tools=tools,
    middleware=[my_prompt],
    context_schema=Context,
)

agent.invoke(
    {"messages": [{"role": "user", "content": "Explain async programming"}]},
    context=Context(user_role="expert"),
)
```

## Rules

- Do not pass a function as `system_prompt`. The v1 API takes a string there; dynamic behavior lives in middleware.
- `context_schema` types the context; `context=` on invoke/stream supplies it. This replaces stuffing values into `config["configurable"]`.
- Keep the prompt function pure and fast: it runs before every model call. Expensive lookups belong in before_agent middleware or in tools.