add open enums, server selection, update description

This commit is contained in:
Sheldon Vaughn
2025-09-18 07:54:13 -05:00
parent 540701c0a3
commit 5d06b0a7b4
16 changed files with 128 additions and 61 deletions
+2 -2
View File
@@ -5,8 +5,8 @@ import importlib.metadata
__title__: str = "openrouter"
__version__: str = "0.1.0"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.701.8"
__user_agent__: str = "speakeasy-sdk/python 0.1.0 2.701.8 1.0.0 openrouter"
__gen_version__: str = "2.702.0"
__user_agent__: str = "speakeasy-sdk/python 0.1.0 2.702.0 1.0.0 openrouter"
try:
if __package__ is not None:
+11 -5
View File
@@ -12,14 +12,17 @@ from openrouter.types import (
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from typing import Literal
from typing_extensions import NotRequired, TypedDict
from pydantic.functional_validators import PlainValidator
from typing import Literal, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ChatCompletionChoiceFinishReason = Literal[
"tool_calls", "stop", "length", "content_filter", "error"
ChatCompletionChoiceFinishReason = Union[
Literal["tool_calls", "stop", "length", "content_filter", "error"], UnrecognizedStr
]
r"""Reason the completion finished"""
@@ -40,7 +43,10 @@ class ChatCompletionChoiceTypedDict(TypedDict):
class ChatCompletionChoice(BaseModel):
r"""Chat completion choice"""
finish_reason: Nullable[ChatCompletionChoiceFinishReason]
finish_reason: Annotated[
Nullable[ChatCompletionChoiceFinishReason],
PlainValidator(validate_open_enum(False)),
]
r"""Reason the completion finished"""
index: float
@@ -15,14 +15,17 @@ from openrouter.types import (
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
from pydantic import model_serializer
from typing import Literal
from typing_extensions import NotRequired, TypedDict
from pydantic.functional_validators import PlainValidator
from typing import Literal, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ChatCompletionChunkChoiceFinishReason = Literal[
"tool_calls", "stop", "length", "content_filter", "error"
ChatCompletionChunkChoiceFinishReason = Union[
Literal["tool_calls", "stop", "length", "content_filter", "error"], UnrecognizedStr
]
@@ -43,7 +46,10 @@ class ChatCompletionChunkChoice(BaseModel):
delta: ChatCompletionChunkChoiceDelta
r"""Delta changes in streaming response"""
finish_reason: Nullable[ChatCompletionChunkChoiceFinishReason]
finish_reason: Annotated[
Nullable[ChatCompletionChunkChoiceFinishReason],
PlainValidator(validate_open_enum(False)),
]
index: float
@@ -1,16 +1,18 @@
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
from __future__ import annotations
from openrouter.types import BaseModel
from openrouter.types import BaseModel, UnrecognizedStr
from openrouter.utils import validate_open_enum
import pydantic
from typing import Literal
from pydantic.functional_validators import PlainValidator
from typing import Literal, Union
from typing_extensions import Annotated, TypedDict
ChatCompletionContentPartAudioType = Literal["input_audio"]
ChatCompletionContentPartAudioFormat = Literal[
"wav", "mp3", "flac", "m4a", "ogg", "pcm16", "pcm24"
ChatCompletionContentPartAudioFormat = Union[
Literal["wav", "mp3", "flac", "m4a", "ogg", "pcm16", "pcm24"], UnrecognizedStr
]
r"""Audio format"""
@@ -27,7 +29,11 @@ class InputAudio(BaseModel):
r"""Base64 encoded audio data"""
format_: Annotated[
ChatCompletionContentPartAudioFormat, pydantic.Field(alias="format")
Annotated[
ChatCompletionContentPartAudioFormat,
PlainValidator(validate_open_enum(False)),
],
pydantic.Field(alias="format"),
]
r"""Audio format"""
@@ -7,17 +7,20 @@ from openrouter.types import (
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
import pydantic
from pydantic import model_serializer
from typing import Literal, Optional
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ReasoningDetailEncryptedType = Literal["reasoning.encrypted"]
ReasoningDetailEncryptedFormat = Literal[
"unknown", "openai-responses-v1", "anthropic-claude-v1"
ReasoningDetailEncryptedFormat = Union[
Literal["unknown", "openai-responses-v1", "anthropic-claude-v1"], UnrecognizedStr
]
@@ -41,7 +44,11 @@ class ReasoningDetailEncrypted(BaseModel):
id: OptionalNullable[str] = UNSET
format_: Annotated[
OptionalNullable[ReasoningDetailEncryptedFormat], pydantic.Field(alias="format")
Annotated[
OptionalNullable[ReasoningDetailEncryptedFormat],
PlainValidator(validate_open_enum(False)),
],
pydantic.Field(alias="format"),
] = "anthropic-claude-v1"
index: Optional[float] = None
@@ -7,17 +7,20 @@ from openrouter.types import (
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
import pydantic
from pydantic import model_serializer
from typing import Literal, Optional
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ReasoningDetailSummaryType = Literal["reasoning.summary"]
ReasoningDetailSummaryFormat = Literal[
"unknown", "openai-responses-v1", "anthropic-claude-v1"
ReasoningDetailSummaryFormat = Union[
Literal["unknown", "openai-responses-v1", "anthropic-claude-v1"], UnrecognizedStr
]
@@ -41,7 +44,11 @@ class ReasoningDetailSummary(BaseModel):
id: OptionalNullable[str] = UNSET
format_: Annotated[
OptionalNullable[ReasoningDetailSummaryFormat], pydantic.Field(alias="format")
Annotated[
OptionalNullable[ReasoningDetailSummaryFormat],
PlainValidator(validate_open_enum(False)),
],
pydantic.Field(alias="format"),
] = "anthropic-claude-v1"
index: Optional[float] = None
+11 -4
View File
@@ -7,17 +7,20 @@ from openrouter.types import (
OptionalNullable,
UNSET,
UNSET_SENTINEL,
UnrecognizedStr,
)
from openrouter.utils import validate_open_enum
import pydantic
from pydantic import model_serializer
from typing import Literal, Optional
from pydantic.functional_validators import PlainValidator
from typing import Literal, Optional, Union
from typing_extensions import Annotated, NotRequired, TypedDict
ReasoningDetailTextType = Literal["reasoning.text"]
ReasoningDetailTextFormat = Literal[
"unknown", "openai-responses-v1", "anthropic-claude-v1"
ReasoningDetailTextFormat = Union[
Literal["unknown", "openai-responses-v1", "anthropic-claude-v1"], UnrecognizedStr
]
@@ -44,7 +47,11 @@ class ReasoningDetailText(BaseModel):
id: OptionalNullable[str] = UNSET
format_: Annotated[
OptionalNullable[ReasoningDetailTextFormat], pydantic.Field(alias="format")
Annotated[
OptionalNullable[ReasoningDetailTextFormat],
PlainValidator(validate_open_enum(False)),
],
pydantic.Field(alias="format"),
] = "anthropic-claude-v1"
index: Optional[float] = None
+8 -7
View File
@@ -11,7 +11,7 @@ from openrouter import models, utils
from openrouter._hooks import SDKHooks
from openrouter.types import OptionalNullable, UNSET
import sys
from typing import Any, Callable, Dict, List, Optional, TYPE_CHECKING, Union, cast
from typing import Any, Callable, Dict, Optional, TYPE_CHECKING, Union, cast
import weakref
if TYPE_CHECKING:
@@ -32,7 +32,7 @@ class OpenRouter(BaseSDK):
self,
api_key: Optional[Union[Optional[str], Callable[[], Optional[str]]]] = None,
provider_url: Optional[str] = None,
server_idx: Optional[int] = None,
server: Optional[str] = None,
server_url: Optional[str] = None,
url_params: Optional[Dict[str, str]] = None,
client: Optional[HttpClient] = None,
@@ -45,7 +45,7 @@ class OpenRouter(BaseSDK):
:param api_key: The api_key required for authentication
:param provider_url: Allows setting the provider_url variable for url substitution
:param server_idx: The index of the server to use for all methods
:param server: The server by name to use for all methods
:param server_url: The server URL to use for all methods
:param url_params: Parameters to optionally template the server URL with
:param client: The HTTP client to use for all synchronous methods
@@ -84,11 +84,12 @@ class OpenRouter(BaseSDK):
if server_url is not None:
if url_params is not None:
server_url = utils.template_url(server_url, url_params)
server_defaults: List[Dict[str, str]] = [
{
server_defaults: Dict[str, Dict[str, str]] = {
"production": {
"provider_url": provider_url or "openrouter.ai",
},
]
}
BaseSDK.__init__(
self,
@@ -99,7 +100,7 @@ class OpenRouter(BaseSDK):
async_client_supplied=async_client_supplied,
security=security,
server_url=server_url,
server_idx=server_idx,
server=server,
server_defaults=server_defaults,
retry_config=retry_config,
timeout_ms=timeout_ms,
+14 -10
View File
@@ -12,13 +12,14 @@ from dataclasses import dataclass, field
from openrouter import models
from openrouter.types import OptionalNullable, UNSET
from pydantic import Field
from typing import Callable, Dict, List, Optional, Tuple, Union
from typing import Callable, Dict, Optional, Tuple, Union
SERVERS = [
"https://{provider_url}/api/v1",
# Production server
]
SERVER_PRODUCTION = "production"
r"""Production server"""
SERVERS = {
SERVER_PRODUCTION: "https://{provider_url}/api/v1",
}
"""Contains the list of servers available to the SDK"""
@@ -31,8 +32,8 @@ class SDKConfiguration:
debug_logger: Logger
security: Optional[Union[models.Security, Callable[[], models.Security]]] = None
server_url: Optional[str] = ""
server_idx: Optional[int] = 0
server_defaults: List[Dict[str, str]] = field(default_factory=List)
server: Optional[str] = ""
server_defaults: Dict[str, Dict[str, str]] = field(default_factory=Dict)
language: str = "python"
openapi_doc_version: str = __openapi_doc_version__
sdk_version: str = __version__
@@ -44,7 +45,10 @@ class SDKConfiguration:
def get_server_details(self) -> Tuple[str, Dict[str, str]]:
if self.server_url is not None and self.server_url:
return remove_suffix(self.server_url, "/"), {}
if self.server_idx is None:
self.server_idx = 0
if not self.server:
self.server = SERVER_PRODUCTION
return SERVERS[self.server_idx], self.server_defaults[self.server_idx]
if self.server not in SERVERS:
raise ValueError(f'Invalid server "{self.server}"')
return SERVERS[self.server], self.server_defaults.get(self.server, {})