"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" from .basesdk import BaseSDK from openrouter import components, errors, operations, utils from openrouter._hooks import HookContext from openrouter.types import OptionalNullable, UNSET from openrouter.utils import eventstreaming, get_security_from_env from openrouter.utils.unmarshal_json_response import unmarshal_json_response from typing import ( Any, Dict, Iterable, List, Literal, Mapping, Optional, Union, overload, ) class Responses(BaseSDK): r"""beta.responses endpoints""" @overload def send( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Union[Literal[False], None] = None, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> components.OpenResponsesResult: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ @overload def send( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Literal[True], temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> eventstreaming.EventStream[components.StreamEvents]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ @overload def send( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: bool, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> Union[ components.OpenResponsesResult, eventstreaming.EventStream[components.StreamEvents], ]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ def send( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Optional[bool] = False, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> Union[ components.OpenResponsesResult, eventstreaming.EventStream[components.StreamEvents], ]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ base_url = None url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms if server_url is not None: base_url = server_url else: base_url = self._get_url(base_url, url_variables) request = operations.CreateResponsesRequest( http_referer=http_referer, x_open_router_title=x_open_router_title, x_open_router_categories=x_open_router_categories, x_open_router_metadata=x_open_router_metadata, responses_request=components.ResponsesRequest( background=background, cache_control=utils.get_pydantic_model( cache_control, Optional[components.AnthropicCacheControlDirective] ), debug=utils.get_pydantic_model( debug, Optional[components.ChatDebugOptions] ), frequency_penalty=frequency_penalty, image_config=utils.unmarshal( image_config, Optional[Dict[str, components.ImageConfig]] ), include=utils.unmarshal( include, OptionalNullable[List[components.ResponseIncludesEnum]] ), input=utils.get_pydantic_model(input, Optional[components.InputsUnion]), instructions=instructions, max_output_tokens=max_output_tokens, max_tool_calls=max_tool_calls, metadata=utils.unmarshal(metadata, OptionalNullable[Dict[str, str]]), modalities=utils.unmarshal( modalities, Optional[List[components.OutputModalityEnum]] ), model=model, models=utils.unmarshal(models, Optional[List[str]]), parallel_tool_calls=parallel_tool_calls, plugins=utils.get_pydantic_model( plugins, Optional[List[components.ResponsesRequestPlugin]] ), presence_penalty=presence_penalty, previous_response_id=previous_response_id, prompt=utils.get_pydantic_model( prompt, OptionalNullable[components.StoredPromptTemplate] ), prompt_cache_key=prompt_cache_key, prompt_cache_options=utils.get_pydantic_model( prompt_cache_options, OptionalNullable[components.PromptCacheOptions], ), provider=utils.get_pydantic_model( provider, OptionalNullable[components.ProviderPreferences] ), reasoning=utils.get_pydantic_model( reasoning, OptionalNullable[components.ReasoningConfig] ), safety_identifier=safety_identifier, service_tier=service_tier, session_id=session_id, stop_server_tools_when=utils.get_pydantic_model( stop_server_tools_when, Optional[List[components.StopServerToolsWhenCondition]], ), stream=stream, temperature=temperature, text=utils.get_pydantic_model( text, Optional[components.TextExtendedConfig] ), tool_choice=utils.get_pydantic_model( tool_choice, Optional[components.OpenAIResponsesToolChoiceUnion] ), tools=utils.get_pydantic_model( tools, Optional[List[components.ResponsesRequestToolUnion]] ), top_k=top_k, top_logprobs=top_logprobs, top_p=top_p, trace=utils.get_pydantic_model(trace, Optional[components.TraceConfig]), truncation=truncation, user=user, ), ) req = self._build_request( method="POST", path="/responses", base_url=base_url, url_variables=url_variables, request=request, request_body_required=True, request_has_path_params=False, request_has_query_params=True, user_agent_header="user-agent", accept_header_value="text/event-stream" if stream is True else "application/json", http_headers=http_headers, _globals=operations.CreateResponsesGlobals( http_referer=self.sdk_configuration.globals.http_referer, x_open_router_title=self.sdk_configuration.globals.x_open_router_title, x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, ), security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( request.responses_request, False, False, "json", components.ResponsesRequest, ), allow_empty_value=None, timeout_ms=timeout_ms, ) if retries == UNSET: if self.sdk_configuration.retry_config is not UNSET: retries = self.sdk_configuration.retry_config else: retries = utils.RetryConfig( "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True ) retry_config = None if isinstance(retries, utils.RetryConfig): retry_config = (retries, ["5XX"]) http_res = self.do_request( hook_ctx=HookContext( config=self.sdk_configuration, base_url=base_url or "", operation_id="createResponses", oauth2_scopes=None, security_source=get_security_from_env( self.sdk_configuration.security, components.Security ), tags=["beta.responses"], extensions=None, ), request=req, is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), stream=stream is True, retry_config=retry_config, ) response_data: Any = None if utils.match_response(http_res, "200", "application/json"): http_res_text = utils.stream_to_text(http_res) return unmarshal_json_response( components.OpenResponsesResult, http_res, http_res_text ) if utils.match_response(http_res, "200", "text/event-stream"): return eventstreaming.EventStream( http_res, lambda raw: unmarshal_json_response( components.ResponsesStreamingResponse, http_res, raw ).data, sentinel="[DONE]", client_ref=self, ) if utils.match_response(http_res, "400", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res, http_res_text ) raise errors.BadRequestResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "401", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res, http_res_text ) raise errors.UnauthorizedResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "402", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.PaymentRequiredResponseErrorData, http_res, http_res_text ) raise errors.PaymentRequiredResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "403", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.ForbiddenResponseErrorData, http_res, http_res_text ) raise errors.ForbiddenResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "404", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.NotFoundResponseErrorData, http_res, http_res_text ) raise errors.NotFoundResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "408", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.RequestTimeoutResponseErrorData, http_res, http_res_text ) raise errors.RequestTimeoutResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "413", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.PayloadTooLargeResponseErrorData, http_res, http_res_text ) raise errors.PayloadTooLargeResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "422", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.UnprocessableEntityResponseErrorData, http_res, http_res_text ) raise errors.UnprocessableEntityResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "429", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.TooManyRequestsResponseErrorData, http_res, http_res_text ) raise errors.TooManyRequestsResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "500", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.InternalServerResponseErrorData, http_res, http_res_text ) raise errors.InternalServerResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "502", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.BadGatewayResponseErrorData, http_res, http_res_text ) raise errors.BadGatewayResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "503", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.ServiceUnavailableResponseErrorData, http_res, http_res_text ) raise errors.ServiceUnavailableResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "524", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.EdgeNetworkTimeoutResponseErrorData, http_res, http_res_text ) raise errors.EdgeNetworkTimeoutResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "529", "application/json"): http_res_text = utils.stream_to_text(http_res) response_data = unmarshal_json_response( errors.ProviderOverloadedResponseErrorData, http_res, http_res_text ) raise errors.ProviderOverloadedResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "4XX", "*"): http_res_text = utils.stream_to_text(http_res) raise errors.OpenRouterDefaultError( "API error occurred", http_res, http_res_text ) if utils.match_response(http_res, "5XX", "*"): http_res_text = utils.stream_to_text(http_res) raise errors.OpenRouterDefaultError( "API error occurred", http_res, http_res_text ) http_res_text = utils.stream_to_text(http_res) raise errors.OpenRouterDefaultError( "Unexpected response received", http_res, http_res_text ) @overload async def send_async( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Union[Literal[False], None] = None, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> components.OpenResponsesResult: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ @overload async def send_async( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Literal[True], temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> eventstreaming.EventStreamAsync[components.StreamEvents]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ @overload async def send_async( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: bool, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> Union[ components.OpenResponsesResult, eventstreaming.EventStreamAsync[components.StreamEvents], ]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ async def send_async( self, *, http_referer: Optional[str] = None, x_open_router_title: Optional[str] = None, x_open_router_categories: Optional[str] = None, x_open_router_metadata: Optional[components.MetadataLevel] = None, background: OptionalNullable[bool] = UNSET, cache_control: Optional[ Union[ components.AnthropicCacheControlDirective, components.AnthropicCacheControlDirectiveTypedDict, ] ] = None, debug: Optional[ Union[components.ChatDebugOptions, components.ChatDebugOptionsTypedDict] ] = None, frequency_penalty: OptionalNullable[float] = UNSET, image_config: Optional[ Union[ Mapping[str, components.ImageConfig], Mapping[str, components.ImageConfigTypedDict], ] ] = None, include: OptionalNullable[Iterable[components.ResponseIncludesEnum]] = UNSET, input: Optional[ Union[components.InputsUnion, components.InputsUnionTypedDict] ] = None, instructions: OptionalNullable[str] = UNSET, max_output_tokens: OptionalNullable[int] = UNSET, max_tool_calls: OptionalNullable[int] = UNSET, metadata: OptionalNullable[Mapping[str, str]] = UNSET, modalities: Optional[Iterable[components.OutputModalityEnum]] = None, model: Optional[str] = None, models: Optional[Iterable[str]] = None, parallel_tool_calls: OptionalNullable[bool] = UNSET, plugins: Optional[ Union[ Iterable[components.ResponsesRequestPlugin], Iterable[components.ResponsesRequestPluginTypedDict], ] ] = None, presence_penalty: OptionalNullable[float] = UNSET, previous_response_id: OptionalNullable[str] = UNSET, prompt: OptionalNullable[ Union[ components.StoredPromptTemplate, components.StoredPromptTemplateTypedDict, ] ] = UNSET, prompt_cache_key: OptionalNullable[str] = UNSET, prompt_cache_options: OptionalNullable[ Union[components.PromptCacheOptions, components.PromptCacheOptionsTypedDict] ] = UNSET, provider: OptionalNullable[ Union[ components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, reasoning: OptionalNullable[ Union[components.ReasoningConfig, components.ReasoningConfigTypedDict] ] = UNSET, safety_identifier: OptionalNullable[str] = UNSET, service_tier: OptionalNullable[components.ResponsesRequestServiceTier] = "auto", session_id: Optional[str] = None, stop_server_tools_when: Optional[ Union[ Iterable[components.StopServerToolsWhenCondition], Iterable[components.StopServerToolsWhenConditionTypedDict], ] ] = None, stream: Optional[bool] = False, temperature: OptionalNullable[float] = UNSET, text: Optional[ Union[components.TextExtendedConfig, components.TextExtendedConfigTypedDict] ] = None, tool_choice: Optional[ Union[ components.OpenAIResponsesToolChoiceUnion, components.OpenAIResponsesToolChoiceUnionTypedDict, ] ] = None, tools: Optional[ Union[ Iterable[components.ResponsesRequestToolUnion], Iterable[components.ResponsesRequestToolUnionTypedDict], ] ] = None, top_k: Optional[int] = None, top_logprobs: OptionalNullable[int] = UNSET, top_p: OptionalNullable[float] = UNSET, trace: Optional[ Union[components.TraceConfig, components.TraceConfigTypedDict] ] = None, truncation: OptionalNullable[components.OpenAIResponsesTruncation] = UNSET, user: Optional[str] = None, retries: OptionalNullable[utils.RetryConfig] = UNSET, server_url: Optional[str] = None, timeout_ms: Optional[int] = None, http_headers: Optional[Mapping[str, str]] = None, ) -> Union[ components.OpenResponsesResult, eventstreaming.EventStreamAsync[components.StreamEvents], ]: r"""Create a response Creates a streaming or non-streaming response using OpenResponses API format :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings. This is used to track API usage per application. :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard. :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings. :param x_open_router_metadata: Opt-in to surface routing metadata on the response under `openrouter_metadata`. Defaults to `disabled`. The legacy header `X-OpenRouter-Experimental-Metadata` is also accepted for backward compatibility. :param background: :param cache_control: Enable automatic prompt caching. When set at the top level, the system automatically applies cache breakpoints to the last cacheable block in the request. When set on an individual content block, it marks an explicit cache breakpoint; block-level markers also work on OpenAI models that support explicit prompt caching — OpenRouter converts them to the provider's native format. :param debug: Debug options for inspecting request transformations (streaming only) :param frequency_penalty: :param image_config: Provider-specific image configuration options. Keys and values vary by model/provider. See https://openrouter.ai/docs/guides/overview/multimodal/image-generation for more details. :param include: :param input: Input for a response request - can be a string or array of items :param instructions: :param max_output_tokens: :param max_tool_calls: :param metadata: Metadata key-value pairs for the request. Keys must be ≤64 characters and cannot contain brackets. Values must be ≤512 characters. Maximum 16 pairs allowed. :param modalities: Output modalities for the response. Supported values are \"text\" and \"image\". :param model: :param models: :param parallel_tool_calls: :param plugins: Plugins you want to enable for this request, including their settings. :param presence_penalty: :param previous_response_id: :param prompt: :param prompt_cache_key: :param prompt_cache_options: Request-level prompt-cache controls. `mode: \"explicit\"` disables OpenAI-managed breakpoints so only blocks marked with `prompt_cache_breakpoint` are cached. Only supported by OpenAI GPT-5.6 and newer. :param provider: When multiple model providers are available, optionally indicate your routing preference. :param reasoning: Configuration for reasoning mode in the response :param safety_identifier: :param service_tier: :param session_id: 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. :param stop_server_tools_when: Stop conditions for the server-tool agent loop. Any condition firing halts the loop (OR logic). When set, this overrides `max_tool_calls`. :param stream: :param temperature: :param text: Text output configuration including format and verbosity :param tool_choice: :param tools: :param top_k: :param top_logprobs: :param top_p: :param trace: 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. :param truncation: :param user: A unique identifier representing your end-user, which helps distinguish between different users of your app. This allows your app to identify specific users in case of abuse reports, preventing your entire app from being affected by the actions of individual users. Maximum of 256 characters. :param retries: Override the default retry configuration for this method :param server_url: Override the default server URL for this method :param timeout_ms: Override the default request timeout configuration for this method in milliseconds :param http_headers: Additional headers to set or replace on requests. """ base_url = None url_variables = None if timeout_ms is None: timeout_ms = self.sdk_configuration.timeout_ms if server_url is not None: base_url = server_url else: base_url = self._get_url(base_url, url_variables) request = operations.CreateResponsesRequest( http_referer=http_referer, x_open_router_title=x_open_router_title, x_open_router_categories=x_open_router_categories, x_open_router_metadata=x_open_router_metadata, responses_request=components.ResponsesRequest( background=background, cache_control=utils.get_pydantic_model( cache_control, Optional[components.AnthropicCacheControlDirective] ), debug=utils.get_pydantic_model( debug, Optional[components.ChatDebugOptions] ), frequency_penalty=frequency_penalty, image_config=utils.unmarshal( image_config, Optional[Dict[str, components.ImageConfig]] ), include=utils.unmarshal( include, OptionalNullable[List[components.ResponseIncludesEnum]] ), input=utils.get_pydantic_model(input, Optional[components.InputsUnion]), instructions=instructions, max_output_tokens=max_output_tokens, max_tool_calls=max_tool_calls, metadata=utils.unmarshal(metadata, OptionalNullable[Dict[str, str]]), modalities=utils.unmarshal( modalities, Optional[List[components.OutputModalityEnum]] ), model=model, models=utils.unmarshal(models, Optional[List[str]]), parallel_tool_calls=parallel_tool_calls, plugins=utils.get_pydantic_model( plugins, Optional[List[components.ResponsesRequestPlugin]] ), presence_penalty=presence_penalty, previous_response_id=previous_response_id, prompt=utils.get_pydantic_model( prompt, OptionalNullable[components.StoredPromptTemplate] ), prompt_cache_key=prompt_cache_key, prompt_cache_options=utils.get_pydantic_model( prompt_cache_options, OptionalNullable[components.PromptCacheOptions], ), provider=utils.get_pydantic_model( provider, OptionalNullable[components.ProviderPreferences] ), reasoning=utils.get_pydantic_model( reasoning, OptionalNullable[components.ReasoningConfig] ), safety_identifier=safety_identifier, service_tier=service_tier, session_id=session_id, stop_server_tools_when=utils.get_pydantic_model( stop_server_tools_when, Optional[List[components.StopServerToolsWhenCondition]], ), stream=stream, temperature=temperature, text=utils.get_pydantic_model( text, Optional[components.TextExtendedConfig] ), tool_choice=utils.get_pydantic_model( tool_choice, Optional[components.OpenAIResponsesToolChoiceUnion] ), tools=utils.get_pydantic_model( tools, Optional[List[components.ResponsesRequestToolUnion]] ), top_k=top_k, top_logprobs=top_logprobs, top_p=top_p, trace=utils.get_pydantic_model(trace, Optional[components.TraceConfig]), truncation=truncation, user=user, ), ) req = self._build_request_async( method="POST", path="/responses", base_url=base_url, url_variables=url_variables, request=request, request_body_required=True, request_has_path_params=False, request_has_query_params=True, user_agent_header="user-agent", accept_header_value="text/event-stream" if stream is True else "application/json", http_headers=http_headers, _globals=operations.CreateResponsesGlobals( http_referer=self.sdk_configuration.globals.http_referer, x_open_router_title=self.sdk_configuration.globals.x_open_router_title, x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories, ), security=self.sdk_configuration.security, get_serialized_body=lambda: utils.serialize_request_body( request.responses_request, False, False, "json", components.ResponsesRequest, ), allow_empty_value=None, timeout_ms=timeout_ms, ) if retries == UNSET: if self.sdk_configuration.retry_config is not UNSET: retries = self.sdk_configuration.retry_config else: retries = utils.RetryConfig( "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True ) retry_config = None if isinstance(retries, utils.RetryConfig): retry_config = (retries, ["5XX"]) http_res = await self.do_request_async( hook_ctx=HookContext( config=self.sdk_configuration, base_url=base_url or "", operation_id="createResponses", oauth2_scopes=None, security_source=get_security_from_env( self.sdk_configuration.security, components.Security ), tags=["beta.responses"], extensions=None, ), request=req, is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c), stream=stream is True, retry_config=retry_config, ) response_data: Any = None if utils.match_response(http_res, "200", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) return unmarshal_json_response( components.OpenResponsesResult, http_res, http_res_text ) if utils.match_response(http_res, "200", "text/event-stream"): return eventstreaming.EventStreamAsync( http_res, lambda raw: unmarshal_json_response( components.ResponsesStreamingResponse, http_res, raw ).data, sentinel="[DONE]", client_ref=self, ) if utils.match_response(http_res, "400", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.BadRequestResponseErrorData, http_res, http_res_text ) raise errors.BadRequestResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "401", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.UnauthorizedResponseErrorData, http_res, http_res_text ) raise errors.UnauthorizedResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "402", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.PaymentRequiredResponseErrorData, http_res, http_res_text ) raise errors.PaymentRequiredResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "403", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.ForbiddenResponseErrorData, http_res, http_res_text ) raise errors.ForbiddenResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "404", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.NotFoundResponseErrorData, http_res, http_res_text ) raise errors.NotFoundResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "408", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.RequestTimeoutResponseErrorData, http_res, http_res_text ) raise errors.RequestTimeoutResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "413", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.PayloadTooLargeResponseErrorData, http_res, http_res_text ) raise errors.PayloadTooLargeResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "422", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.UnprocessableEntityResponseErrorData, http_res, http_res_text ) raise errors.UnprocessableEntityResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "429", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.TooManyRequestsResponseErrorData, http_res, http_res_text ) raise errors.TooManyRequestsResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "500", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.InternalServerResponseErrorData, http_res, http_res_text ) raise errors.InternalServerResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "502", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.BadGatewayResponseErrorData, http_res, http_res_text ) raise errors.BadGatewayResponseError(response_data, http_res, http_res_text) if utils.match_response(http_res, "503", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.ServiceUnavailableResponseErrorData, http_res, http_res_text ) raise errors.ServiceUnavailableResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "524", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.EdgeNetworkTimeoutResponseErrorData, http_res, http_res_text ) raise errors.EdgeNetworkTimeoutResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "529", "application/json"): http_res_text = await utils.stream_to_text_async(http_res) response_data = unmarshal_json_response( errors.ProviderOverloadedResponseErrorData, http_res, http_res_text ) raise errors.ProviderOverloadedResponseError( response_data, http_res, http_res_text ) if utils.match_response(http_res, "4XX", "*"): http_res_text = await utils.stream_to_text_async(http_res) raise errors.OpenRouterDefaultError( "API error occurred", http_res, http_res_text ) if utils.match_response(http_res, "5XX", "*"): http_res_text = await utils.stream_to_text_async(http_res) raise errors.OpenRouterDefaultError( "API error occurred", http_res, http_res_text ) http_res_text = await utils.stream_to_text_async(http_res) raise errors.OpenRouterDefaultError( "Unexpected response received", http_res, http_res_text )