Skip to content

Messages

The messages and amessages functions use the Anthropic Messages API format. All providers support this through automatic conversion, so you can use the same Anthropic-style message format regardless of backend.

def messages(
model: str,
messages: list[dict[str, Any]],
max_tokens: int,
*,
provider: str | LLMProvider | None = None,
system: str | None = None,
temperature: float | None = None,
top_p: float | None = None,
top_k: int | None = None,
stream: bool | None = None,
stop_sequences: list[str] | None = None,
tools: list[dict[str, Any]] | None = None,
tool_choice: dict[str, Any] | None = None,
metadata: dict[str, Any] | None = None,
thinking: dict[str, Any] | None = None,
api_key: str | None = None,
api_base: str | None = None,
client_args: dict[str, Any] | None = None,
**kwargs: Any,
) -> MessageResponse | Iterator[MessageStreamEvent]

Async variant with the same parameters. Returns MessageResponse | AsyncIterator[MessageStreamEvent].

async def amessages(
model: str,
messages: list[dict[str, Any]],
max_tokens: int,
*,
provider: str | LLMProvider | None = None,
system: str | None = None,
temperature: float | None = None,
top_p: float | None = None,
top_k: int | None = None,
stream: bool | None = None,
stop_sequences: list[str] | None = None,
tools: list[dict[str, Any]] | None = None,
tool_choice: dict[str, Any] | None = None,
metadata: dict[str, Any] | None = None,
thinking: dict[str, Any] | None = None,
api_key: str | None = None,
api_base: str | None = None,
client_args: dict[str, Any] | None = None,
**kwargs: Any,
) -> MessageResponse | AsyncIterator[MessageStreamEvent]
ParameterTypeDefaultDescription
modelstrrequiredModel identifier. Recommended: Use with separate provider parameter. Alternative: Combined format ‘provider:model’.
messageslist[dict[str, Any]]requiredList of messages in Anthropic format.
max_tokensintrequiredMaximum number of tokens to generate.
providerstr | LLMProvider | NoneNoneProvider name to use for the request.
systemstr | NoneNoneSystem prompt.
temperaturefloat | NoneNoneControls randomness (0.0 to 1.0).
top_pfloat | NoneNoneControls diversity via nucleus sampling.
top_kint | NoneNoneOnly sample from the top K options.
streambool | NoneNoneWhether to stream the response.
stop_sequenceslist[str] | NoneNoneCustom stop sequences.
toolslist[dict[str, Any]] | NoneNoneList of tools in Anthropic format.
tool_choicedict[str, Any] | NoneNoneControls which tool the model uses.
metadatadict[str, Any] | NoneNoneRequest metadata.
thinkingdict[str, Any] | NoneNoneThinking/reasoning configuration.
api_keystr | NoneNoneAPI key for the provider.
api_basestr | NoneNoneBase URL for the provider API.
client_argsdict[str, Any] | NoneNoneAdditional provider-specific arguments for client instantiation.
**kwargsAnyrequiredAdditional provider-specific arguments.
  • Non-streaming: Returns a MessageResponse object.
  • Streaming (stream=True): Returns an Iterator[MessageStreamEvent] (sync) or AsyncIterator[MessageStreamEvent] (async).
from any_llm.api import messages
response = messages(
model="claude-sonnet-4-20250514",
provider="anthropic",
messages=[{"role": "user", "content": "Hello!"}],
max_tokens=1024,
)
print(response.content[0].text)
response = messages(
model="claude-sonnet-4-20250514",
provider="anthropic",
messages=[{"role": "user", "content": "Translate to French: Hello"}],
max_tokens=1024,
system="You are a professional translator.",
)
import asyncio
from any_llm.api import amessages
async def main():
response = await amessages(
model="claude-sonnet-4-20250514",
provider="anthropic",
messages=[{"role": "user", "content": "Hello!"}],
max_tokens=1024,
)
print(response.content[0].text)
asyncio.run(main())