> Fetch clean Markdown by appending `.md` to any page URL under https://signalwire.com/docs or requesting it with the HTTP header `Accept: text/markdown`. The root index at https://signalwire.com/docs/llms.txt lists the available documentation indexes. # onSwmlRequest > Lifecycle hook called on every SWML request before rendering. [render-swml]: /docs/server-sdks/reference/typescript/agents/agent-base/render-swml Lifecycle hook called on every incoming SWML request before the SWML document is rendered. The default implementation is a no-op. Override this method in a subclass to inspect or modify agent state before each call is processed. Common uses include loading caller-specific data from a database, adjusting prompts based on request metadata, or logging request details. ## **Parameters** **`rawData`** `Record` — required The parsed request body. Contains call metadata such as `call_id`, `caller_id_number`, `caller_id_name`, and any custom SIP headers. --- **`callbackPath`** `string` Optional callback path from the request body (`callback_path` field), when the request was triggered via a callback URL. --- **`context`** `any` The raw Hono request context (`c`), providing access to headers, query parameters, and the underlying HTTP request. --- ## **Returns** `Record | void | Promise | void>` -- Return a modifications object to merge into the AI verb config before rendering. `global_data` is deep-merged; all other keys override AI config fields directly. Return `void` / `undefined` to render without modifications. > **Tip** > > For most per-request customization scenarios, prefer > [`setDynamicConfigCallback()`](/docs/server-sdks/reference/typescript/agents/agent-base/set-dynamic-config-callback) > which provides a higher-level interface with access to query params, body, headers, > and an ephemeral agent copy. ## **Example** ```typescript {9} import { AgentBase } from '@signalwire/sdk'; class PersonalizedAgent extends AgentBase { constructor() { super({ name: 'personalized', route: '/personalized' }); this.setPromptText('You are a helpful assistant.'); } override async onSwmlRequest( rawData: Record, ): Promise { const callerId = (rawData.caller_id_number as string) ?? 'unknown'; console.log(`Incoming call from ${callerId}`); this.updateGlobalData({ caller_number: callerId }); } } const agent = new PersonalizedAgent(); await agent.serve(); ``` > Lifecycle hook called on every SWML request before rendering.