import * as z from "zod";
import { createAgent, createMiddleware, type AgentState, SystemMessage } from "langchain";
import { type Runtime } from "@langchain/langgraph";
const contextSchema = z.object({
userName: z.string(),
});
// Dynamic prompt middleware
const dynamicPromptMiddleware = createMiddleware({
name: "DynamicPrompt",
beforeModel: (state: AgentState, runtime: Runtime<z.infer<typeof contextSchema>>) => {
const userName = runtime.context?.userName;
if (!userName) {
throw new Error("userName is required");
}
const systemMsg = `You are a helpful assistant. Address the user as ${userName}.`;
return {
messages: [new SystemMessage(systemMsg), ...state.messages]
};
}
});
// Logging middleware
const loggingMiddleware = createMiddleware({
name: "Logging",
beforeModel: (state: AgentState, runtime: Runtime<z.infer<typeof contextSchema>>) => {
console.log(`Processing request for user: ${runtime.context?.userName}`);
return;
},
afterModel: (state: AgentState, runtime: Runtime<z.infer<typeof contextSchema>>) => {
console.log(`Completed request for user: ${runtime.context?.userName}`);
return;
}
});
const agent = createAgent({
model: "gpt-4o",
tools: [
/* ... */
],
middleware: [dynamicPromptMiddleware, loggingMiddleware],
contextSchema,
});
const result = await agent.invoke(
{ messages: [{ role: "user", content: "What's my name?" }] },
{ context: { userName: "John Smith" } }
);