Skip to main content

Chat Client API Reference

Chat client classes for interacting with language models.

SupportsChatGetResponse

Protocol defining the interface that all chat clients must implement.
from agent_framework import SupportsChatGetResponse

Protocol Properties

additional_properties
dict[str, Any]
required
Dictionary for storing additional client-specific properties.

get_response()

Send input and return the response.
response = await client.get_response(
    messages=[Message(role="user", text="Hello")],
    stream=False,
    options={"temperature": 0.7}
)
messages
Sequence[Message]
required
The sequence of input messages to send.
stream
bool
default:"False"
Whether to stream the response.
options
ChatOptions | None
Chat options as a TypedDict including model_id, temperature, max_tokens, etc.
**kwargs
Any
Additional chat options.
return
Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]
When stream=False: An awaitable ChatResponse from the client.When stream=True: A ResponseStream yielding partial updates.

Example: Custom Chat Client

from agent_framework import SupportsChatGetResponse, ChatResponse, Message
from agent_framework import ChatResponseUpdate, ResponseStream

class CustomChatClient:
    additional_properties: dict = {}
    
    def get_response(self, messages, *, stream=False, options=None, **kwargs):
        if stream:
            async def _stream():
                yield ChatResponseUpdate(
                    role="assistant",
                    contents=[{"type": "text", "text": "Hello!"}]
                )
            return ResponseStream(_stream())
        else:
            async def _response():
                return ChatResponse(
                    messages=[Message(role="assistant", text="Hello!")],
                    response_id="custom"
                )
            return _response()

# Verify protocol compatibility
client = CustomChatClient()
assert isinstance(client, SupportsChatGetResponse)

BaseChatClient

Abstract base class for chat clients without middleware wrapping.
from agent_framework import BaseChatClient, ChatResponse, Message

Constructor

class CustomChatClient(BaseChatClient):
    async def _inner_get_response(self, *, messages, stream, options, **kwargs):
        # Implementation required
        if stream:
            # Return AsyncIterable[ChatResponseUpdate] or ResponseStream
            pass
        else:
            # Return ChatResponse
            pass

client = CustomChatClient(
    additional_properties={"api_key": "sk-..."}
)
additional_properties
dict[str, Any] | None
Additional properties for the client.
**kwargs
Any
Additional keyword arguments merged into additional_properties.

Class Variables

OTEL_PROVIDER_NAME
str
default:"unknown"
Provider name for OpenTelemetry tracing. Override in subclasses.
STORES_BY_DEFAULT
bool
default:"False"
Whether this client stores conversation history server-side by default.Clients that use server-side storage (e.g., OpenAI Responses API) should override to True.

Abstract Methods

_inner_get_response()

Internal method to be implemented by derived classes.
async def _inner_get_response(
    self,
    *,
    messages: Sequence[Message],
    stream: bool,
    options: Mapping[str, Any],
    **kwargs: Any
) -> Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]:
    """Send a chat request to the AI service."""
    # Validate options first
    validated_options = await self._validate_options(options)
    
    if stream:
        # Return streaming response
        async def _stream():
            yield ChatResponseUpdate(...)
        return self._build_response_stream(_stream())
    else:
        # Return non-streaming response
        return ChatResponse(...)
messages
Sequence[Message]
required
The prepared chat messages to send.
stream
bool
required
Whether to stream the response.
options
Mapping[str, Any]
required
The options dict for the request. Call _validate_options() first.
**kwargs
Any
Additional keyword arguments.
return
Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]
When stream=False: An Awaitable ChatResponse from the model.When stream=True: A ResponseStream of ChatResponseUpdate instances.

Helper Methods

_validate_options()

Validate and normalize chat options.
validated = await self._validate_options(options)
options
Mapping[str, Any]
required
The raw options dict.
return
dict[str, Any]
The validated and normalized options dict.

_build_response_stream()

Create a ResponseStream with the standard finalizer.
stream = self._build_response_stream(
    _async_generator(),
    response_format=MyModel
)
stream
AsyncIterable[ChatResponseUpdate] | Awaitable[AsyncIterable[ChatResponseUpdate]]
required
The async iterable or awaitable async iterable.
response_format
type[BaseModel] | None
Optional response format for structured output.
return
ResponseStream[ChatResponseUpdate, ChatResponse]
A ResponseStream with automatic finalization.

Public Methods

get_response()

Get a response from the chat client.
response = await client.get_response(
    messages=[Message(role="user", text="Hello")],
    stream=False,
    options={"temperature": 0.7, "max_tokens": 500}
)
messages
Sequence[Message]
required
The messages to send to the model.
stream
bool
default:"False"
Whether to stream the response.
options
ChatOptions | None
Chat options as a TypedDict.
**kwargs
Any
Additional keyword arguments for function-specific parameters.
return
Awaitable[ChatResponse] | ResponseStream[ChatResponseUpdate, ChatResponse]
When streaming: a response stream of ChatResponseUpdates.Otherwise: an Awaitable ChatResponse.

as_agent()

Create an Agent with this client.
agent = client.as_agent(
    name="assistant",
    instructions="You are a helpful assistant.",
    tools=[get_weather],
    default_options={"temperature": 0.7}
)
id
str | None
The unique identifier for the agent.
name
str | None
The name of the agent.
description
str | None
A brief description of the agent’s purpose.
instructions
str | None
Instructions sent to the chat client as a system message.
tools
ToolTypes | Callable | Sequence[ToolTypes | Callable] | None
The tools to use for the agent.
default_options
ChatOptions | None
Default chat options. Enables IDE autocomplete for provider-specific options.
context_providers
Sequence[BaseContextProvider] | None
Context providers to include during agent invocation.
middleware
Sequence[MiddlewareTypes] | None
List of middleware to intercept agent and function invocations.
**kwargs
Any
Additional keyword arguments stored as additional_properties.
return
Agent
An Agent instance configured with this chat client.

Example: Custom Chat Client Implementation

from agent_framework import BaseChatClient, ChatResponse, Message
from agent_framework import ChatResponseUpdate
from collections.abc import AsyncIterable

class CustomChatClient(BaseChatClient):
    def __init__(self, api_key: str, **kwargs):
        super().__init__(
            additional_properties={"api_key": api_key},
            **kwargs
        )
    
    async def _inner_get_response(
        self,
        *,
        messages,
        stream,
        options,
        **kwargs
    ):
        # Validate options
        validated = await self._validate_options(options)
        
        if stream:
            # Streaming implementation
            async def _stream():
                yield ChatResponseUpdate(
                    role="assistant",
                    contents=[{"type": "text", "text": "Hello!"}]
                )
            return self._build_response_stream(_stream())
        else:
            # Non-streaming implementation
            return ChatResponse(
                messages=[Message(role="assistant", text="Hello!")],
                response_id="custom-response"
            )

# Create and use the client
client = CustomChatClient(api_key="sk-...")
response = await client.get_response(
    [Message(role="user", text="Hello, how are you?")]
)

# Or create an agent
agent = client.as_agent(
    name="assistant",
    instructions="You are helpful."
)

Tool Support Protocols

Protocols for runtime checking of tool support capabilities.

SupportsCodeInterpreterTool

from agent_framework import SupportsCodeInterpreterTool

if isinstance(client, SupportsCodeInterpreterTool):
    tool = client.get_code_interpreter_tool()
    agent = Agent(client, tools=[tool])

SupportsWebSearchTool

from agent_framework import SupportsWebSearchTool

if isinstance(client, SupportsWebSearchTool):
    tool = client.get_web_search_tool()
    agent = Agent(client, tools=[tool])

SupportsImageGenerationTool

from agent_framework import SupportsImageGenerationTool

if isinstance(client, SupportsImageGenerationTool):
    tool = client.get_image_generation_tool()
    agent = Agent(client, tools=[tool])

SupportsMCPTool

from agent_framework import SupportsMCPTool

if isinstance(client, SupportsMCPTool):
    tool = client.get_mcp_tool(name="my_mcp", url="https://...")
    agent = Agent(client, tools=[tool])

SupportsFileSearchTool

from agent_framework import SupportsFileSearchTool

if isinstance(client, SupportsFileSearchTool):
    tool = client.get_file_search_tool(vector_store_ids=["vs_123"])
    agent = Agent(client, tools=[tool])

Embedding Clients

SupportsGetEmbeddings

Protocol for embedding generation.
from agent_framework import SupportsGetEmbeddings

async def use_embeddings(client: SupportsGetEmbeddings) -> None:
    result = await client.get_embeddings(["Hello, world!"])
    for embedding in result:
        print(embedding.vector)

BaseEmbeddingClient

Abstract base class for embedding clients.
from agent_framework import BaseEmbeddingClient, Embedding, GeneratedEmbeddings

class CustomEmbeddingClient(BaseEmbeddingClient):
    async def get_embeddings(self, values, *, options=None):
        return GeneratedEmbeddings(
            [Embedding(vector=[0.1, 0.2, 0.3]) for _ in values]
        )

Build docs developers (and LLMs) love