LlmRequest is the outbound container for one language-model call. An agent keeps its full execution state in ExecutionContext, then selects and formats the information the model needs into an LlmRequest. The request is a staging area, not a copy of the entire context. section 4.2.2
Its four fields separate the decisions involved in a call:
- instructions: a list of system-prompt fragments, which can combine base instructions with task-specific or dynamic guidance. section 4.5.2
- contents: conversation history as ContentItem objects, including messages, requested ToolCalls, and ToolResults. section 4.5.2
- tools: available BaseTool instances whose definitions the client sends to the model. section 4.5.2
- tool_choice: an optional selection setting; "auto" lets the model decide whether to use tools, while "required" forces tool use. section 4.5.2
Listing 4.9 LlmRequest class
class LlmRequest(BaseModel):
"""Request object for LLM calls."""
instructions: List[str] = Field(default_factory=list)
contents: List[ContentItem] = Field(default_factory=list)
tools: List[BaseTool] = Field(default_factory=list)
tool_choice: Optional[str] = None
The Pydantic definition shows the four fields directly: the three lists have empty-list defaults, and tool_choice defaults to None. section 4.5.2
The agent builds the request; LlmClient handles API formatting. In a basic think–act step, _prepare_llm_request() flattens the context’s events into contents, adds the agent’s instructions and tools, and chooses "auto" when tools are available. The client then converts those items into API messages and tool definitions, makes the call through LiteLLM, and returns an LlmResponse. LlmRequest itself contains no ExecutionContext or Events reference and knows nothing about provider message formats. section 4.6.3 section 4.5.4
A minimal call
Create LlmRequest(instructions=["You are a helpful assistant."], contents=[Message(role="user", content="What is 2 + 2?")]), then pass it to await client.generate(request). The returned response holds output as ContentItem objects; this example reads an answer of "4" from a Message. section 4.5.5
Keeping request preparation separate makes context selection changeable without altering stored history or API code. The basic implementation sends every event, but the preparation step could instead summarize old messages, omit irrelevant tool results, or inject additional information. Conversion still needs care: when contents contain a ToolCall, LlmClient attaches it to the preceding assistant message in the API format and links later ToolResults by call ID. section 4.6.3 section 4.5.4
