> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://openrouter.ai/docs/llms.txt.
> For full documentation content, see https://openrouter.ai/docs/llms-full.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://openrouter.ai/docs/_mcp/server.

# Chat - Python SDK

The Python SDK and docs are currently in beta.
Report issues on [GitHub](https://github.com/OpenRouterTeam/python-sdk/issues).

## Overview

### Available Operations

* [send](#send) - Create a chat completion

## send

Sends a request for a model response for the given chat conversation. Supports both streaming and non-streaming modes.

### Example Usage

```python
from openrouter import OpenRouter
import os

with OpenRouter(
    http_referer="<value>",
    x_open_router_title="<value>",
    x_open_router_categories="<value>",
    api_key=os.getenv("OPENROUTER_API_KEY", ""),
) as open_router:

    res = open_router.chat.send(messages=[
        {
            "content": "You are a helpful assistant.",
            "role": "system",
        },
        {
            "content": "What is the capital of France?",
            "role": "user",
        },
    ], x_open_router_experimental_metadata="enabled", max_tokens=150, model="openai/gpt-4", stream=False, temperature=0.7)

    with res as event_stream:
        for event in event_stream:
            # handle event
            print(event, flush=True)

```

### Parameters

| Parameter                             | Type                                                                                                                      | Required             | Description                                                                                                                                                                                                                                                                                                                                                                                                          | Example                                                                                                            |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| `messages`                            | List\[[components.ChatMessages](/docs/sdks/python/api-reference/components/chatmessages)]                                 | :heavy\_check\_mark: | List of messages for the conversation                                                                                                                                                                                                                                                                                                                                                                                | \[<br />`{"content": "Hello!","role": "user"}`<br />]                                                              |
| `http_referer`                        | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.<br />This is used to track API usage per application.<br />                                                                                                                                                                                                                                                          |                                                                                                                    |
| `x_open_router_title`                 | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.<br />                                                                                                                                                                                                                                                                                                                   |                                                                                                                    |
| `x_open_router_categories`            | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.<br />                                                                                                                                                                                                                                                                                                          |                                                                                                                    |
| `x_open_router_experimental_metadata` | [Optional\[components.MetadataLevel\]](../../components/metadatalevel.md)                                                 | :heavy\_minus\_sign: | Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`.                                                                                                                                                                                                                                                                                                              | enabled                                                                                                            |
| `cache_control`                       | [Optional\[components.AnthropicCacheControlDirective\]](../../components/anthropiccachecontroldirective.md)               | :heavy\_minus\_sign: | Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. Currently supported for Anthropic Claude models.                                                                                                                                                                                                          | `{"type": "ephemeral"}`                                                                                            |
| `debug`                               | [Optional\[components.ChatDebugOptions\]](../../components/chatdebugoptions.md)                                           | :heavy\_minus\_sign: | Debug options for inspecting request transformations (streaming only)                                                                                                                                                                                                                                                                                                                                                | `{"echo_upstream_body": true}`                                                                                     |
| `frequency_penalty`                   | *OptionalNullable\[float]*                                                                                                | :heavy\_minus\_sign: | Frequency penalty (-2.0 to 2.0)                                                                                                                                                                                                                                                                                                                                                                                      | 0                                                                                                                  |
| `image_config`                        | Dict\[str, [components.ImageConfig](/docs/sdks/python/api-reference/components/imageconfig)]                              | :heavy\_minus\_sign: | Provider-specific image configuration options. Keys and values vary by model/provider. See [https://openrouter.ai/docs/guides/overview/multimodal/image-generation](https://openrouter.ai/docs/guides/overview/multimodal/image-generation) for more details.                                                                                                                                                        | `{"aspect_ratio": "16:9","quality": "high"}`                                                                       |
| `logit_bias`                          | Dict\[str, *float*]                                                                                                       | :heavy\_minus\_sign: | Token logit bias adjustments                                                                                                                                                                                                                                                                                                                                                                                         | `{"50256": -100}`                                                                                                  |
| `logprobs`                            | *OptionalNullable\[bool]*                                                                                                 | :heavy\_minus\_sign: | Return log probabilities                                                                                                                                                                                                                                                                                                                                                                                             | false                                                                                                              |
| `max_completion_tokens`               | *OptionalNullable\[int]*                                                                                                  | :heavy\_minus\_sign: | Maximum tokens in completion                                                                                                                                                                                                                                                                                                                                                                                         | 100                                                                                                                |
| `max_tokens`                          | *OptionalNullable\[int]*                                                                                                  | :heavy\_minus\_sign: | Maximum tokens (deprecated, use max\_completion\_tokens). Note: some providers enforce a minimum of 16.                                                                                                                                                                                                                                                                                                              | 100                                                                                                                |
| `metadata`                            | Dict\[str, *str*]                                                                                                         | :heavy\_minus\_sign: | Key-value pairs for additional object information (max 16 pairs, 64 char keys, 512 char values)                                                                                                                                                                                                                                                                                                                      | `{"session_id": "session-456","user_id": "user-123"}`                                                              |
| `modalities`                          | List\[[components.Modality](/docs/sdks/python/api-reference/components/modality)]                                         | :heavy\_minus\_sign: | Output modalities for the response. Supported values are "text", "image", and "audio".                                                                                                                                                                                                                                                                                                                               | \[<br />"text",<br />"image"<br />]                                                                                |
| `model`                               | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | Model to use for completion                                                                                                                                                                                                                                                                                                                                                                                          | openai/gpt-4                                                                                                       |
| `models`                              | List\[*str*]                                                                                                              | :heavy\_minus\_sign: | Models to use for completion                                                                                                                                                                                                                                                                                                                                                                                         | \[<br />"openai/gpt-4",<br />"openai/gpt-4o"<br />]                                                                |
| `parallel_tool_calls`                 | *OptionalNullable\[bool]*                                                                                                 | :heavy\_minus\_sign: | Whether to enable parallel function calling during tool use. When true, the model may generate multiple tool calls in a single response.                                                                                                                                                                                                                                                                             | true                                                                                                               |
| `plugins`                             | List\[[components.ChatRequestPlugin](/docs/sdks/python/api-reference/components/chatrequestplugin)]                       | :heavy\_minus\_sign: | Plugins you want to enable for this request, including their settings.                                                                                                                                                                                                                                                                                                                                               |                                                                                                                    |
| `presence_penalty`                    | *OptionalNullable\[float]*                                                                                                | :heavy\_minus\_sign: | Presence penalty (-2.0 to 2.0)                                                                                                                                                                                                                                                                                                                                                                                       | 0                                                                                                                  |
| `provider`                            | [OptionalNullable\[components.ProviderPreferences\]](../../components/providerpreferences.md)                             | :heavy\_minus\_sign: | When multiple model providers are available, optionally indicate your routing preference.                                                                                                                                                                                                                                                                                                                            | `{"allow_fallbacks": true}`                                                                                        |
| `reasoning`                           | [Optional\[components.ChatRequestReasoning\]](../../components/chatrequestreasoning.md)                                   | :heavy\_minus\_sign: | Configuration options for reasoning models                                                                                                                                                                                                                                                                                                                                                                           | `{"effort": "medium","summary": "concise"}`                                                                        |
| `response_format`                     | [Optional\[components.ResponseFormat\]](../../components/responseformat.md)                                               | :heavy\_minus\_sign: | Response format configuration                                                                                                                                                                                                                                                                                                                                                                                        | `{"type": "json_object"}`                                                                                          |
| `seed`                                | *OptionalNullable\[int]*                                                                                                  | :heavy\_minus\_sign: | Random seed for deterministic outputs                                                                                                                                                                                                                                                                                                                                                                                | 42                                                                                                                 |
| `service_tier`                        | [OptionalNullable\[components.ChatRequestServiceTier\]](../../components/chatrequestservicetier.md)                       | :heavy\_minus\_sign: | The service tier to use for processing this request.                                                                                                                                                                                                                                                                                                                                                                 | auto                                                                                                               |
| `session_id`                          | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | A unique identifier for grouping related requests (e.g., a conversation or agent workflow). When provided, OpenRouter uses it as the sticky routing key, routing all requests in the session to the same provider to maximize prompt cache hits. Also used for observability grouping. If provided in both the request body and the x-session-id header, the body value takes precedence. Maximum of 256 characters. |                                                                                                                    |
| `stop`                                | [OptionalNullable\[components.Stop\]](../../components/stop.md)                                                           | :heavy\_minus\_sign: | Stop sequences (up to 4)                                                                                                                                                                                                                                                                                                                                                                                             | \[<br />""<br />]                                                                                                  |
| `stop_server_tools_when`              | List\[[components.StopServerToolsWhenCondition](/docs/sdks/python/api-reference/components/stopservertoolswhencondition)] | :heavy\_minus\_sign: | Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`.                                                                                                                                                                                                                                                                           | \[<br />`{"step_count": 5,"type": "step_count_is"}`,<br />`{"max_cost_in_dollars": 0.5,"type": "max_cost"}`<br />] |
| `stream`                              | *Optional\[bool]*                                                                                                         | :heavy\_minus\_sign: | Enable streaming response                                                                                                                                                                                                                                                                                                                                                                                            | false                                                                                                              |
| `stream_options`                      | [OptionalNullable\[components.ChatStreamOptions\]](../../components/chatstreamoptions.md)                                 | :heavy\_minus\_sign: | Streaming configuration options                                                                                                                                                                                                                                                                                                                                                                                      | `{"include_usage": true}`                                                                                          |
| `temperature`                         | *OptionalNullable\[float]*                                                                                                | :heavy\_minus\_sign: | Sampling temperature (0-2)                                                                                                                                                                                                                                                                                                                                                                                           | 0.7                                                                                                                |
| `tool_choice`                         | [Optional\[components.ChatToolChoice\]](../../components/chattoolchoice.md)                                               | :heavy\_minus\_sign: | Tool choice configuration                                                                                                                                                                                                                                                                                                                                                                                            | auto                                                                                                               |
| `tools`                               | List\[[components.ChatFunctionTool](/docs/sdks/python/api-reference/components/chatfunctiontool)]                         | :heavy\_minus\_sign: | Available tools for function calling                                                                                                                                                                                                                                                                                                                                                                                 | \[<br />`{"function": {"description": "Get weather","name": "get_weather"}`,<br />"type": "function"<br />}<br />] |
| `top_logprobs`                        | *OptionalNullable\[int]*                                                                                                  | :heavy\_minus\_sign: | Number of top log probabilities to return (0-20)                                                                                                                                                                                                                                                                                                                                                                     | 5                                                                                                                  |
| `top_p`                               | *OptionalNullable\[float]*                                                                                                | :heavy\_minus\_sign: | Nucleus sampling parameter (0-1)                                                                                                                                                                                                                                                                                                                                                                                     | 1                                                                                                                  |
| `trace`                               | [Optional\[components.TraceConfig\]](../../components/traceconfig.md)                                                     | :heavy\_minus\_sign: | Metadata for observability and tracing. Known keys (trace\_id, trace\_name, span\_name, generation\_name, parent\_span\_id) have special handling. Additional keys are passed through as custom metadata to configured broadcast destinations.                                                                                                                                                                       | `{"trace_id": "trace-abc123","trace_name": "my-app-trace"}`                                                        |
| `user`                                | *Optional\[str]*                                                                                                          | :heavy\_minus\_sign: | Unique user identifier                                                                                                                                                                                                                                                                                                                                                                                               | user-123                                                                                                           |
| `retries`                             | [Optional\[utils.RetryConfig\]](../../models/utils/retryconfig.md)                                                        | :heavy\_minus\_sign: | Configuration to override the default retry behavior of the client.                                                                                                                                                                                                                                                                                                                                                  |                                                                                                                    |

### Response

**[operations.SendChatCompletionRequestResponse](/docs/sdks/python/api-reference/operations/sendchatcompletionrequestresponse)**

### Errors

| Error Type                              | Status Code | Content Type     |
| --------------------------------------- | ----------- | ---------------- |
| errors.BadRequestResponseError          | 400         | application/json |
| errors.UnauthorizedResponseError        | 401         | application/json |
| errors.PaymentRequiredResponseError     | 402         | application/json |
| errors.ForbiddenResponseError           | 403         | application/json |
| errors.NotFoundResponseError            | 404         | application/json |
| errors.RequestTimeoutResponseError      | 408         | application/json |
| errors.PayloadTooLargeResponseError     | 413         | application/json |
| errors.UnprocessableEntityResponseError | 422         | application/json |
| errors.TooManyRequestsResponseError     | 429         | application/json |
| errors.InternalServerResponseError      | 500         | application/json |
| errors.BadGatewayResponseError          | 502         | application/json |
| errors.ServiceUnavailableResponseError  | 503         | application/json |
| errors.EdgeNetworkTimeoutResponseError  | 524         | application/json |
| errors.ProviderOverloadedResponseError  | 529         | application/json |
| errors.OpenRouterDefaultError           | 4XX, 5XX    | \*/\*            |