diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 94bc492b..206228ad 100644 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,19 +1,19 @@ lockVersion: 2.0.0 id: c48cf606-fb42-4a45-9c23-8f0555307828 management: - docChecksum: 219138d21d3208e1bd68f92347d55010 + docChecksum: 7bd9b89fbec22196d1905c5c343c5a3f docVersion: 1.0.0 speakeasyVersion: 1.787.0 generationVersion: 2.914.0 - releaseVersion: 1.2.13 - configChecksum: c0af818f98f85ef347b558275e16b064 + releaseVersion: 1.2.14 + configChecksum: 802743116b703c7d1d4da10855dfdb26 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: a41f374d-9e61-41cc-a7da-adbbbbc8e345 - pristine_commit_hash: 240b1991f0af1ac81205aea316704e5dfde5caa5 - pristine_tree_hash: fe700f6e6e0763ec2ae1763a5be7f4cd00195369 + generation_id: 9c3c1c68-6766-4a03-af9e-8c8d26193017 + pristine_commit_hash: 4847c3203bade2f349f3a6e921f66191fb329f49 + pristine_tree_hash: c1bbe1d3081315160c4967c57a55f086ee11c9e9 features: python: acceptHeaders: 3.0.0 @@ -429,6 +429,10 @@ trackedFiles: id: 6e7d778bbb64 last_write_checksum: sha1:7bc64373f6ef127247b59329f49d3718db308f94 pristine_git_object: a538343b4f3fca39a44d3f208e702c482978c4f8 + docs/components/anthropicsafeguard.mdx: + id: 04d5a44fa933 + last_write_checksum: sha1:9a6630599e8ab797618710ef7ab860e4e99e086d + pristine_git_object: 91de925eb8efe7a55877472f1ad711d95de87b5c docs/components/anthropicsearchresultblockparam.mdx: id: 5c62b24b2c58 last_write_checksum: sha1:b6f01f3da19d4a430e66f5c47e90f31aa3fb0e29 @@ -3419,8 +3423,8 @@ trackedFiles: pristine_git_object: cff8f3938a8bd5699d1111a6b1a926518d868da5 docs/components/messagesrequest.mdx: id: 762dd6b894c8 - last_write_checksum: sha1:d20e54aa91eca2f0cdb99204b4e10c4dddfb37c1 - pristine_git_object: c6ea7b581e5c2ab5114902348fed6160adb35d86 + last_write_checksum: sha1:93a5f746077cd5b4ea3fca3af56038ada71e1d2a + pristine_git_object: e676436dad3ae086fbf10d2e7c93efe98ad7fc63 docs/components/messagesrequestmetadata.mdx: id: facdcaeb2576 last_write_checksum: sha1:42bf112bc4f6d259c589906fd5f67c5342ab4c2d @@ -8147,8 +8151,8 @@ trackedFiles: pristine_git_object: e45eea9aea2f1a8c6ec83a496b844524f17cae00 docs/sdks/presets/README.mdx: id: eeb505928d52 - last_write_checksum: sha1:181f70100ee446628aae36f14b085628463351e5 - pristine_git_object: 0963c3509c5a94b74abd27bb06b1bdbcee916a89 + last_write_checksum: sha1:5b980d4ab7648ff7d33f2a6177dbb0e1959f840a + pristine_git_object: 8e9d4ff28791ae4861022833877f024168746428 docs/sdks/providers/README.mdx: id: 5ea9af111324 last_write_checksum: sha1:570b55655ee7602d3807c3218e450741f634eed6 @@ -8195,8 +8199,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:6ac7f07a3d16945f5b9ef3a72c4cd4df1e166179 - pristine_git_object: 8e6a8e74a275b0b884ac9aef8df139ac9b71af2d + last_write_checksum: sha1:8c54b6c9af35c07744640b023191e7464607c6ad + pristine_git_object: 3c96005ec9f6061ebb0433ff241702b99831f58a scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -8223,8 +8227,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:ce7a24a8717c5a14d95cad02a9f3733362b8669b - pristine_git_object: 07e55bb007b89c56b5c167f1fd3b5060517aa8dc + last_write_checksum: sha1:fd01494d6e9ee077697de96692d6f1a87b26bb5a + pristine_git_object: f36d1bffdd91f724ff2e13c9a2da5d123ea77f16 src/openrouter/alpha.py: id: 306c4d93308d last_write_checksum: sha1:0c25a52ed5fb688ec1e923e4e82bcfc9cae49465 @@ -8267,8 +8271,8 @@ trackedFiles: pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1 src/openrouter/components/__init__.py: id: 81754e97b3f4 - last_write_checksum: sha1:22f126f19f0c274c6b088c353a4870b0c06e5bd6 - pristine_git_object: 737e3eb96b8cc6f5ce5d0d5020a515d6a317090d + last_write_checksum: sha1:b601eeca8f608df36c42e1b6d2f5ee4af2087eab + pristine_git_object: c72a9ee2868adf11a45fb1b3e304c7e0f1534af8 src/openrouter/components/aabenchmarkentry.py: id: e2e0f0b48c82 last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c @@ -8413,6 +8417,10 @@ trackedFiles: id: ed38ef79c74b last_write_checksum: sha1:b6584da4f7255412f12de31e02c522fb84d4cfd0 pristine_git_object: d16f6dc9a2449185ef45731cbcd0a78c266745ef + src/openrouter/components/anthropicsafeguard.py: + id: 9662137c5446 + last_write_checksum: sha1:e82188bb7d0496e4c8b5861056e7c98e5c0d6a15 + pristine_git_object: 92cd8415275b96ee89d41d5bebf5c0bc8b9ece90 src/openrouter/components/anthropicsearchresultblockparam.py: id: bccb7c6b3128 last_write_checksum: sha1:8d073fef507a39b53421384ff9a5914fd9438493 @@ -9791,8 +9799,8 @@ trackedFiles: pristine_git_object: 7e69d1f775baece5f94b03d35bcd884d5e6f519d src/openrouter/components/messagesrequest.py: id: 72b1f339024d - last_write_checksum: sha1:8b3f52fbea000cc6e6210d11ced6a66b12afb8f0 - pristine_git_object: f5ed488b2c42fd539be0fa54981ff910815caff5 + last_write_checksum: sha1:5e987cd30d23c25d36afd823fa7166b61ae6e4ad + pristine_git_object: 000db971b93a5f36d79ad297249253bd0a8b8bc0 src/openrouter/components/messagessearchmodelsservertool.py: id: 53d755edb120 last_write_checksum: sha1:389786fc22ba4bb47b0a086b7aa321f2f04fe943 @@ -11695,8 +11703,8 @@ trackedFiles: pristine_git_object: 6e0305fa49d62303a81e2dfbac78ae63449a94d6 src/openrouter/presets.py: id: bd0c40379dcd - last_write_checksum: sha1:094822356e810035d976d0375016828996483ffd - pristine_git_object: 60b30231949968b5e16162c2658005bfc14b7684 + last_write_checksum: sha1:012e9e46e986826ecc6921e8376545d1da68f2f9 + pristine_git_object: 1e9d65482e3c1fa99b859eb3d5411e23644b263d src/openrouter/providers.py: id: debc4c48f149 last_write_checksum: sha1:11dbc607825edee8dcc84b39ee8171e097c47acf @@ -15046,8 +15054,4 @@ examples: examplesVersion: 1.0.2 releaseNotes: | ## Python SDK Changes: - * `open_router.interns.create_intern()`: `error.status[415]` **Added** - * `open_router.interns.delete_intern()`: `error.status[415]` **Added** - * `open_router.interns.update_intern()`: `error.status[415]` **Added** - * `open_router.interns.provision_intern()`: `error.status[415]` **Added** - * `open_router.interns.suspend_intern()`: `error.status[415]` **Added** + * `open_router.presets.create_presets_messages()`: `request.safeguards` **Added** diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index 567ab09d..09958272 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -36,7 +36,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 1.2.13 + version: 1.2.14 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index 6f5b55be..38fcad2d 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -1808,6 +1808,49 @@ components: type: - 'object' - 'null' + AnthropicSafeguard: + additionalProperties: {} + description: 'A server-side safeguard Anthropic evaluates alongside the completion' + example: + classifier_context: + permission_mode: 'auto' + v: 1 + type: 'dangerous_tool_use' + properties: + classifier_context: + additionalProperties: {} + type: 'object' + type: + type: 'string' + required: + - 'type' + type: 'object' + AnthropicSafeguardResult: + additionalProperties: {} + description: 'The outcome of a server-side safeguard, keyed by tool-use id where applicable' + example: + status: + tool_uses: + toolu_01ABC: + outcome: 'not_flagged' + type: 'evaluated' + type: 'available' + type: 'dangerous_tool_use' + properties: + status: + additionalProperties: {} + properties: + type: + type: 'string' + required: + - 'type' + type: 'object' + type: + type: 'string' + required: + - 'type' + - 'status' + type: 'object' AnthropicSearchResultBlockParam: example: content: @@ -14435,6 +14478,12 @@ components: properties: container: $ref: '#/components/schemas/AnthropicContainer' + safeguard_results: + items: + $ref: '#/components/schemas/AnthropicSafeguardResult' + type: + - 'array' + - 'null' stop_details: $ref: '#/components/schemas/AnthropicRefusalStopDetails' stop_reason: @@ -14958,6 +15007,12 @@ components: $ref: '#/components/schemas/ProviderPreferences' route: $ref: '#/components/schemas/DeprecatedRoute' + safeguards: + items: + $ref: '#/components/schemas/AnthropicSafeguard' + type: + - 'array' + - 'null' service_tier: type: 'string' session_id: @@ -15284,6 +15339,12 @@ components: $ref: '#/components/schemas/OpenRouterMetadata' provider: $ref: '#/components/schemas/ProviderName' + safeguard_results: + items: + $ref: '#/components/schemas/AnthropicSafeguardResult' + type: + - 'array' + - 'null' usage: allOf: - $ref: '#/components/schemas/AnthropicUsage' diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index 7c337592..10f24c0a 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,8 +2,8 @@ speakeasyVersion: 1.787.0 sources: OpenRouter API: sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:6f0702ac907d8bd54b9d73be193c3a8789ed15d688449d59fd15f811a5992937 - sourceBlobDigest: sha256:b1b342b61edc0a5ba2bbe4feba950ae641885bbbc37833fdd91cc09ddb10d920 + sourceRevisionDigest: sha256:86362b59ed209d44a72e17143c0d6d553ee4a08a72794dcab7e45b2a6f4e7f5e + sourceBlobDigest: sha256:2cafada247780172cf6ddbb74c56bfe1d46414cfddcd3c6f7bf19124efdf3d46 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:6f0702ac907d8bd54b9d73be193c3a8789ed15d688449d59fd15f811a5992937 - sourceBlobDigest: sha256:b1b342b61edc0a5ba2bbe4feba950ae641885bbbc37833fdd91cc09ddb10d920 + sourceRevisionDigest: sha256:86362b59ed209d44a72e17143c0d6d553ee4a08a72794dcab7e45b2a6f4e7f5e + sourceBlobDigest: sha256:2cafada247780172cf6ddbb74c56bfe1d46414cfddcd3c6f7bf19124efdf3d46 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:1b9e1c30a83b4aa8634943fb0fe750f04de35369c447bafc075f2e77b4fa761d + codeSamplesRevisionDigest: sha256:59f269e778b3e98ce2d668ed3ebdcc893d92dc5a6a07cdd26200a19e59113c02 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.787.0 diff --git a/RELEASES.md b/RELEASES.md index b9d0412f..5cf3ef5f 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -2539,4 +2539,14 @@ Based on: ### Generated - [python v1.2.13] . ### Releases -- [PyPI v1.2.13] https://pypi.org/project/openrouter/1.2.13 - . \ No newline at end of file +- [PyPI v1.2.13] https://pypi.org/project/openrouter/1.2.13 - . + +## 2026-09-21 23:32:33 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v1.2.14] . +### Releases +- [PyPI v1.2.14] https://pypi.org/project/openrouter/1.2.14 - . \ No newline at end of file diff --git a/docs/components/anthropicsafeguard.mdx b/docs/components/anthropicsafeguard.mdx new file mode 100644 index 00000000..91de925e --- /dev/null +++ b/docs/components/anthropicsafeguard.mdx @@ -0,0 +1,14 @@ +--- +title: "AnthropicSafeguard" +--- + +A server-side safeguard Anthropic evaluates alongside the completion + + +## Fields + +| Field | Type | Required | Description | Example | +| --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | +| `classifier_context` | Dict[str, *Any*] | :heavy_minus_sign: | N/A | | +| `type` | *str* | :heavy_check_mark: | N/A | | +| `__pydantic_extra__` | Dict[str, *Any*] | :heavy_minus_sign: | N/A | \{
"classifier_context": \{
"permission_mode": "auto",
"v": 1
},
"type": "dangerous_tool_use"
} | \ No newline at end of file diff --git a/docs/components/messagesrequest.mdx b/docs/components/messagesrequest.mdx index c6ea7b58..e676436d 100644 --- a/docs/components/messagesrequest.mdx +++ b/docs/components/messagesrequest.mdx @@ -20,6 +20,7 @@ Request schema for Anthropic Messages API endpoint | `output_config` | [Optional[components.MessagesOutputConfig]](../components/messagesoutputconfig.mdx) | :heavy_minus_sign: | Configuration for controlling output behavior. Supports the effort parameter and structured output format. | \{
"effort": "medium"
} | | `plugins` | List[[components.MessagesRequestPlugin](../components/messagesrequestplugin.mdx)] | :heavy_minus_sign: | Plugins you want to enable for this request, including their settings. | | | `provider` | [OptionalNullable[components.ProviderPreferences]](../components/providerpreferences.mdx) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | \{
"allow_fallbacks": true
} | +| `safeguards` | List[[components.AnthropicSafeguard](../components/anthropicsafeguard.mdx)] | :heavy_minus_sign: | N/A | | | `service_tier` | *Optional[str]* | :heavy_minus_sign: | N/A | | | `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. | | | `speed` | [OptionalNullable[components.Speed]](../components/speed.mdx) | :heavy_minus_sign: | N/A | fast | diff --git a/docs/sdks/presets/README.mdx b/docs/sdks/presets/README.mdx index 0963c350..8e9d4ff2 100644 --- a/docs/sdks/presets/README.mdx +++ b/docs/sdks/presets/README.mdx @@ -267,6 +267,7 @@ with OpenRouter( | `output_config` | [Optional[components.MessagesOutputConfig]](../../components/messagesoutputconfig.mdx) | :heavy_minus_sign: | Configuration for controlling output behavior. Supports the effort parameter and structured output format. | \{
"effort": "medium"
} | | `plugins` | List[[components.MessagesRequestPlugin](../../components/messagesrequestplugin.mdx)] | :heavy_minus_sign: | Plugins you want to enable for this request, including their settings. | | | `provider` | [OptionalNullable[components.ProviderPreferences]](../../components/providerpreferences.mdx) | :heavy_minus_sign: | When multiple model providers are available, optionally indicate your routing preference. | \{
"allow_fallbacks": true
} | +| `safeguards` | List[[components.AnthropicSafeguard](../../components/anthropicsafeguard.mdx)] | :heavy_minus_sign: | N/A | | | `service_tier` | *Optional[str]* | :heavy_minus_sign: | N/A | | | `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. | | | `speed` | [OptionalNullable[components.Speed]](../../components/speed.mdx) | :heavy_minus_sign: | N/A | fast | diff --git a/pyproject.toml b/pyproject.toml index 8e6a8e74..3c96005e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "1.2.13" +version = "1.2.14" description = "Official Python Client SDK for OpenRouter." authors = [{ name = "OpenRouter" },] readme = "README-PYPI.md" diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py index 07e55bb0..f36d1bff 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "1.2.13" +__version__: str = "1.2.14" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.914.0" -__user_agent__: str = "speakeasy-sdk/python 1.2.13 2.914.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 1.2.14 2.914.0 1.0.0 openrouter" try: if __package__ is not None: diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py index 737e3eb9..c72a9ee2 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -189,6 +189,7 @@ AnthropicPlainTextSourceType, AnthropicPlainTextSourceTypedDict, ) + from .anthropicsafeguard import AnthropicSafeguard, AnthropicSafeguardTypedDict from .anthropicsearchresultblockparam import ( AnthropicSearchResultBlockParam, AnthropicSearchResultBlockParamCitations, @@ -3638,6 +3639,8 @@ "AnthropicPlainTextSourceMediaType", "AnthropicPlainTextSourceType", "AnthropicPlainTextSourceTypedDict", + "AnthropicSafeguard", + "AnthropicSafeguardTypedDict", "AnthropicSearchResultBlockParam", "AnthropicSearchResultBlockParamCitations", "AnthropicSearchResultBlockParamCitationsTypedDict", @@ -6171,6 +6174,8 @@ "AnthropicPlainTextSourceMediaType": ".anthropicplaintextsource", "AnthropicPlainTextSourceType": ".anthropicplaintextsource", "AnthropicPlainTextSourceTypedDict": ".anthropicplaintextsource", + "AnthropicSafeguard": ".anthropicsafeguard", + "AnthropicSafeguardTypedDict": ".anthropicsafeguard", "AnthropicSearchResultBlockParam": ".anthropicsearchresultblockparam", "AnthropicSearchResultBlockParamCitations": ".anthropicsearchresultblockparam", "AnthropicSearchResultBlockParamCitationsTypedDict": ".anthropicsearchresultblockparam", diff --git a/src/openrouter/components/anthropicsafeguard.py b/src/openrouter/components/anthropicsafeguard.py new file mode 100644 index 00000000..92cd8415 --- /dev/null +++ b/src/openrouter/components/anthropicsafeguard.py @@ -0,0 +1,55 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from openrouter.types import BaseModel, UNSET_SENTINEL +import pydantic +from pydantic import ConfigDict, model_serializer +from typing import Any, Dict, Optional +from typing_extensions import NotRequired, TypedDict + + +class AnthropicSafeguardTypedDict(TypedDict): + r"""A server-side safeguard Anthropic evaluates alongside the completion""" + + type: str + classifier_context: NotRequired[Dict[str, Any]] + + +class AnthropicSafeguard(BaseModel): + r"""A server-side safeguard Anthropic evaluates alongside the completion""" + + model_config = ConfigDict( + populate_by_name=True, arbitrary_types_allowed=True, extra="allow" + ) + __pydantic_extra__: Dict[str, Any] = pydantic.Field(init=False) + + type: str + + classifier_context: Optional[Dict[str, Any]] = None + + @property + def additional_properties(self): + return self.__pydantic_extra__ + + @additional_properties.setter + def additional_properties(self, value): + self.__pydantic_extra__ = value # pyright: ignore[reportIncompatibleVariableOverride] + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["classifier_context"]) + serialized = handler(self) + m = {} + + for n, f in type(self).model_fields.items(): + k = f.alias or n + val = serialized.get(k, serialized.get(n)) + serialized.pop(k, serialized.pop(n, None)) + + if val != UNSET_SENTINEL: + if val is not None or k not in optional_fields: + m[k] = val + for k, v in serialized.items(): + m[k] = v + + return m diff --git a/src/openrouter/components/messagesrequest.py b/src/openrouter/components/messagesrequest.py index f5ed488b..000db971 100644 --- a/src/openrouter/components/messagesrequest.py +++ b/src/openrouter/components/messagesrequest.py @@ -14,6 +14,7 @@ AnthropicInputTokensTrigger, AnthropicInputTokensTriggerTypedDict, ) +from .anthropicsafeguard import AnthropicSafeguard, AnthropicSafeguardTypedDict from .anthropictextblockparam import ( AnthropicTextBlockParam, AnthropicTextBlockParamTypedDict, @@ -1128,6 +1129,7 @@ class MessagesRequestTypedDict(TypedDict): r"""Plugins you want to enable for this request, including their settings.""" provider: NotRequired[Nullable[ProviderPreferencesTypedDict]] r"""When multiple model providers are available, optionally indicate your routing preference.""" + safeguards: NotRequired[Nullable[List[AnthropicSafeguardTypedDict]]] service_tier: NotRequired[str] session_id: NotRequired[str] r"""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.""" @@ -1179,6 +1181,8 @@ class MessagesRequest(BaseModel): provider: OptionalNullable[ProviderPreferences] = UNSET r"""When multiple model providers are available, optionally indicate your routing preference.""" + safeguards: OptionalNullable[List[AnthropicSafeguard]] = UNSET + service_tier: Optional[str] = None session_id: Optional[str] = None @@ -1226,6 +1230,7 @@ def serialize_model(self, handler): "output_config", "plugins", "provider", + "safeguards", "service_tier", "session_id", "speed", @@ -1244,7 +1249,14 @@ def serialize_model(self, handler): ] ) nullable_fields = set( - ["context_management", "fallbacks", "messages", "provider", "speed"] + [ + "context_management", + "fallbacks", + "messages", + "provider", + "safeguards", + "speed", + ] ) serialized = handler(self) m = {} diff --git a/src/openrouter/presets.py b/src/openrouter/presets.py index 60b30231..1e9d6548 100644 --- a/src/openrouter/presets.py +++ b/src/openrouter/presets.py @@ -1404,6 +1404,12 @@ def create_presets_messages( components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, + safeguards: OptionalNullable[ + Union[ + Iterable[components.AnthropicSafeguard], + Iterable[components.AnthropicSafeguardTypedDict], + ] + ] = UNSET, service_tier: Optional[str] = None, session_id: Optional[str] = None, speed: OptionalNullable[components.Speed] = UNSET, @@ -1465,6 +1471,7 @@ def create_presets_messages( :param output_config: Configuration for controlling output behavior. Supports the effort parameter and structured output format. :param plugins: Plugins you want to enable for this request, including their settings. :param provider: When multiple model providers are available, optionally indicate your routing preference. + :param safeguards: :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 speed: @@ -1528,6 +1535,9 @@ def create_presets_messages( provider=utils.get_pydantic_model( provider, OptionalNullable[components.ProviderPreferences] ), + safeguards=utils.get_pydantic_model( + safeguards, OptionalNullable[List[components.AnthropicSafeguard]] + ), service_tier=service_tier, session_id=session_id, speed=speed, @@ -1716,6 +1726,12 @@ async def create_presets_messages_async( components.ProviderPreferences, components.ProviderPreferencesTypedDict ] ] = UNSET, + safeguards: OptionalNullable[ + Union[ + Iterable[components.AnthropicSafeguard], + Iterable[components.AnthropicSafeguardTypedDict], + ] + ] = UNSET, service_tier: Optional[str] = None, session_id: Optional[str] = None, speed: OptionalNullable[components.Speed] = UNSET, @@ -1777,6 +1793,7 @@ async def create_presets_messages_async( :param output_config: Configuration for controlling output behavior. Supports the effort parameter and structured output format. :param plugins: Plugins you want to enable for this request, including their settings. :param provider: When multiple model providers are available, optionally indicate your routing preference. + :param safeguards: :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 speed: @@ -1840,6 +1857,9 @@ async def create_presets_messages_async( provider=utils.get_pydantic_model( provider, OptionalNullable[components.ProviderPreferences] ), + safeguards=utils.get_pydantic_model( + safeguards, OptionalNullable[List[components.AnthropicSafeguard]] + ), service_tier=service_tier, session_id=session_id, speed=speed, diff --git a/uv.lock b/uv.lock index 7fe72e89..ca6b1692 100644 --- a/uv.lock +++ b/uv.lock @@ -213,7 +213,7 @@ wheels = [ [[package]] name = "openrouter" -version = "1.2.13" +version = "1.2.14" source = { editable = "." } dependencies = [ { name = "httpcore" },