From ebd10daa9c9be7eb5eb6f6f992deabbfdc813b4e Mon Sep 17 00:00:00 2001 From: speakeasybot Date: Thu, 9 Jul 2026 17:13:26 +0000 Subject: [PATCH 1/2] ## Python SDK Changes: * `open_router.chat.send()`: * `request.messages[].union(assistant).reasoning_details[].union(reasoning.server_tool_call)` **Added** * `response` **Changed** * `open_router.presets.create_presets_chat_completions()`: * `request.messages[].union(assistant).reasoning_details[].union(reasoning.server_tool_call)` **Added** --- .speakeasy/gen.lock | 48 ++++++----- .speakeasy/gen.yaml | 2 +- .speakeasy/out.openapi.yaml | 38 +++++++++ .speakeasy/workflow.lock | 10 +-- RELEASES.md | 12 ++- .../reasoningdetailservertoolcall.mdx | 19 +++++ .../reasoningdetailservertoolcalltype.mdx | 15 ++++ docs/components/reasoningdetailunion.mdx | 6 ++ pyproject.toml | 2 +- src/openrouter/_version.py | 4 +- src/openrouter/components/__init__.py | 11 +++ .../reasoningdetailservertoolcall.py | 84 +++++++++++++++++++ .../components/reasoningdetailunion.py | 7 ++ uv.lock | 2 +- 14 files changed, 230 insertions(+), 30 deletions(-) create mode 100644 docs/components/reasoningdetailservertoolcall.mdx create mode 100644 docs/components/reasoningdetailservertoolcalltype.mdx create mode 100644 src/openrouter/components/reasoningdetailservertoolcall.py diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 726c6bb3..ea088db8 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: 806da48c3f8b0f6fcd8822556deb2d52 + docChecksum: 8f7ea245a84b730eab57728b3cacc35c docVersion: 1.0.0 speakeasyVersion: 1.787.0 generationVersion: 2.914.0 - releaseVersion: 0.11.12 - configChecksum: 716de99521ede522990999611400003e + releaseVersion: 0.11.13 + configChecksum: c88203387459a0cbb769727c96db3986 repoURL: https://github.com/OpenRouterTeam/python-sdk.git installationURL: https://github.com/OpenRouterTeam/python-sdk.git published: true persistentEdits: - generation_id: 8679aa3b-5d9e-4893-8022-baf536bf7090 - pristine_commit_hash: 65881050ceed3021f70ad4f272545c4b4a65c4b1 - pristine_tree_hash: 81dbfc8598b20a107de700cfb2a93473c41dde40 + generation_id: 609662c1-5d0e-47a3-9079-d08e16b49533 + pristine_commit_hash: 4cc996dbf6544dc4b74c850198e2854bc462097d + pristine_tree_hash: 0c0596c5003de8de766314afa7eb7c8f5d5f433b features: python: acceptHeaders: 3.0.0 @@ -3904,6 +3904,14 @@ trackedFiles: id: 7dea8887a486 last_write_checksum: sha1:92808e57ae938c7cfaf7d5ab1dcc2e411d887108 pristine_git_object: 3779ebb04af32b9188d75c4c910752f6ef31ccc6 + docs/components/reasoningdetailservertoolcall.mdx: + id: 095a5cb44df4 + last_write_checksum: sha1:ef83973b82b8630fcb3f195c4bed67e1ea9a0994 + pristine_git_object: 78f316a13caa1cbc4b95082c1273f83cdfdb88b6 + docs/components/reasoningdetailservertoolcalltype.mdx: + id: 703597bf09db + last_write_checksum: sha1:a4415cefe09b6e1944d239999be6622a057ef865 + pristine_git_object: cb6b4d6476d46b8715441055056e000b56448b3d docs/components/reasoningdetailsummary.mdx: id: 264cd49526bd last_write_checksum: sha1:73d7efd548b4a457454ebf381f159797ddc91970 @@ -3922,8 +3930,8 @@ trackedFiles: pristine_git_object: 4b94f542433728f6cf9adce6be943b7be90dbd41 docs/components/reasoningdetailunion.mdx: id: b79bc447eaff - last_write_checksum: sha1:93c29cce21e4ba625b7299ecc8891d1b1fa7ef87 - pristine_git_object: 49ac02bee627aed7cc041917d432dd368463827a + last_write_checksum: sha1:b2451dd8ad86ad3ef3ba6cea0fd18bea1c488bcd + pristine_git_object: 19039845eae5a92b79a1e53f4797cd69996fec0a docs/components/reasoningdoneevent.mdx: id: 3183f11559d0 last_write_checksum: sha1:b2ab6eac3b93629f1643c518dca3e7274d4b17c9 @@ -6458,8 +6466,8 @@ trackedFiles: pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544 pyproject.toml: id: 5d07e7d72637 - last_write_checksum: sha1:ac2002f15d1247065c7cb46d7eefa45718cff498 - pristine_git_object: e6ead548984f180e102da37f58096846d8587c7e + last_write_checksum: sha1:cdca9f1f09271dc533678cd9ba90c0a00909e209 + pristine_git_object: f0cbdaa88fc060abeadb111e9c3466fdaf854ddd scripts/prepare_readme.py: id: e0c5957a6035 last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54 @@ -6486,8 +6494,8 @@ trackedFiles: pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137 src/openrouter/_version.py: id: d8d15ad6c586 - last_write_checksum: sha1:48782d3a645f92804e627ef77ff3a65b355a5e74 - pristine_git_object: 9208d774c192a728cd2db520bd8ca629d9b2e37c + last_write_checksum: sha1:a509125dbf0ac5f32ee0e70ac41c9c1a476e36eb + pristine_git_object: 150a77b0b7087e6c156087c8502ea4b98c03249c src/openrouter/analytics.py: id: cb406b5aaabb last_write_checksum: sha1:9e709b71dd0611056dc0cec6150b578defe32841 @@ -6526,8 +6534,8 @@ trackedFiles: pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1 src/openrouter/components/__init__.py: id: 81754e97b3f4 - last_write_checksum: sha1:fa3d53883e45a8fb738127b91ca4f16c9ff29c9d - pristine_git_object: b5563aa875171f1bc0051960b459f8ee37314405 + last_write_checksum: sha1:d65b820c63aa6a5ee9fdbe852f4e00ccb3d7fbcf + pristine_git_object: 397ffe2ed69a6cd49c904ad5e4a487a6feb4116e src/openrouter/components/aabenchmarkentry.py: id: e2e0f0b48c82 last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c @@ -8176,6 +8184,10 @@ trackedFiles: id: ae7d7526c9b5 last_write_checksum: sha1:df579e34f32d49b348ae1fc8e74904ac4edb03a3 pristine_git_object: 0ba2daa8d62116e1122638e2c703e89428cd742d + src/openrouter/components/reasoningdetailservertoolcall.py: + id: f95da47c231d + last_write_checksum: sha1:5196ad2ea5f8b463bb8e9e98adc54f8faa63a07e + pristine_git_object: 4487eb0e24600c0affed1a29ea5380328c56fd0f src/openrouter/components/reasoningdetailsummary.py: id: 53bda5c72dc5 last_write_checksum: sha1:db665a5b9c7ca3be181719df3c81f07ce3c127ea @@ -8186,8 +8198,8 @@ trackedFiles: pristine_git_object: 49b08a205274f8aad7af7c5c910a7dbc73c12588 src/openrouter/components/reasoningdetailunion.py: id: 3326e0b80cdb - last_write_checksum: sha1:ba9766e0906ce06081ef33e5889ca7c0af870e13 - pristine_git_object: 78e5924ea5aff2f91111acd8348907ff37c738e9 + last_write_checksum: sha1:0a582331054241874c2bb83991b6596c84358e43 + pristine_git_object: 17b2534207bf2a898937bbcf3ee56fd58020cb41 src/openrouter/components/reasoningdoneevent.py: id: 5d7fc847e949 last_write_checksum: sha1:456aa0d5bc1ca2e46d2dd494d3d0f78d77ca23bf @@ -10780,6 +10792,4 @@ examples: "500": application/json: {"error": {"code": 500, "message": "Internal Server Error"}} examplesVersion: 1.0.2 -releaseNotes: | - ## Python SDK Changes: - * `open_router.generations.get_generation()`: `response.data.provider_responses[].routed_service_tier` **Added** +releaseNotes: "## Python SDK Changes:\n* `open_router.chat.send()`: \n * `request.messages[].union(assistant).reasoning_details[].union(reasoning.server_tool_call)` **Added**\n * `response` **Changed**\n* `open_router.presets.create_presets_chat_completions()`: \n * `request.messages[].union(assistant).reasoning_details[].union(reasoning.server_tool_call)` **Added**\n" diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml index f5bd70d6..06fbbbf3 100644 --- a/.speakeasy/gen.yaml +++ b/.speakeasy/gen.yaml @@ -36,7 +36,7 @@ generation: documentation: mintlify preApplyUnionDiscriminators: true python: - version: 0.11.12 + version: 0.11.13 additionalDependencies: dev: {} main: {} diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml index eec586fc..d4dde6da 100644 --- a/.speakeasy/out.openapi.yaml +++ b/.speakeasy/out.openapi.yaml @@ -19277,6 +19277,42 @@ components: - type - data type: object + ReasoningDetailServerToolCall: + description: >- + Record of an OpenRouter server-tool invocation (e.g. openrouter:fusion), carried in reasoning_details so a prior tool call can be rehydrated into a later turn of the same conversation. + example: + arguments: '{"prompt":"Compare carbon tax proposals"}' + result: '{"status":"ok","models":["openai/gpt-4o"]}' + tool_call_id: call_abc123 + tool_name: openrouter:fusion + type: reasoning.server_tool_call + properties: + arguments: + type: string + format: + $ref: '#/components/schemas/ReasoningFormat' + id: + nullable: true + type: string + index: + type: integer + result: + type: string + tool_call_id: + nullable: true + type: string + tool_name: + type: string + type: + enum: + - reasoning.server_tool_call + type: string + required: + - type + - tool_name + - arguments + - result + type: object ReasoningDetailSummary: description: Reasoning detail summary schema example: @@ -19332,6 +19368,7 @@ components: discriminator: mapping: reasoning.encrypted: '#/components/schemas/ReasoningDetailEncrypted' + reasoning.server_tool_call: '#/components/schemas/ReasoningDetailServerToolCall' reasoning.summary: '#/components/schemas/ReasoningDetailSummary' reasoning.text: '#/components/schemas/ReasoningDetailText' propertyName: type @@ -19342,6 +19379,7 @@ components: - $ref: '#/components/schemas/ReasoningDetailSummary' - $ref: '#/components/schemas/ReasoningDetailEncrypted' - $ref: '#/components/schemas/ReasoningDetailText' + - $ref: '#/components/schemas/ReasoningDetailServerToolCall' ReasoningDoneEvent: allOf: - $ref: '#/components/schemas/BaseReasoningDoneEvent' diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index e560c490..16f199c0 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:3c5226489661662950b09fb9ca17bb6ab30677c06d598e45101a4b5e57f4defb - sourceBlobDigest: sha256:dbe7c54c8149d63bb85a11bc4a9d5c4f7b6871426b32289bf314847ed57e4203 + sourceRevisionDigest: sha256:92cd773ef78afbd37e90739af75ab30e169c59cb0931e50a0afbb81a040efa47 + sourceBlobDigest: sha256:ad7b1ae1700a5dd784690c2a598d95fa515f280fd2dfaf020567d85c76f91d73 tags: - latest - 1.0.0 @@ -11,10 +11,10 @@ targets: open-router: source: OpenRouter API sourceNamespace: open-router-chat-completions-api - sourceRevisionDigest: sha256:3c5226489661662950b09fb9ca17bb6ab30677c06d598e45101a4b5e57f4defb - sourceBlobDigest: sha256:dbe7c54c8149d63bb85a11bc4a9d5c4f7b6871426b32289bf314847ed57e4203 + sourceRevisionDigest: sha256:92cd773ef78afbd37e90739af75ab30e169c59cb0931e50a0afbb81a040efa47 + sourceBlobDigest: sha256:ad7b1ae1700a5dd784690c2a598d95fa515f280fd2dfaf020567d85c76f91d73 codeSamplesNamespace: open-router-python-code-samples - codeSamplesRevisionDigest: sha256:51a9185a00a3d2d584952cd0e0351cd69907763d9174fe6e1ce4ab45f608cf8c + codeSamplesRevisionDigest: sha256:67ea1409449c1bdeac71bddc4300e6137ad4d53833ad8b4f631c80c338c5c414 workflow: workflowVersion: 1.0.0 speakeasyVersion: 1.787.0 diff --git a/RELEASES.md b/RELEASES.md index 6277126b..bbebb0db 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -228,4 +228,14 @@ Based on: ### Generated - [python v0.11.12] . ### Releases -- [PyPI v0.11.12] https://pypi.org/project/openrouter/0.11.12 - . \ No newline at end of file +- [PyPI v0.11.12] https://pypi.org/project/openrouter/0.11.12 - . + +## 2026-07-09 17:12:18 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.11.13] . +### Releases +- [PyPI v0.11.13] https://pypi.org/project/openrouter/0.11.13 - . \ No newline at end of file diff --git a/docs/components/reasoningdetailservertoolcall.mdx b/docs/components/reasoningdetailservertoolcall.mdx new file mode 100644 index 00000000..78f316a1 --- /dev/null +++ b/docs/components/reasoningdetailservertoolcall.mdx @@ -0,0 +1,19 @@ +--- +title: "ReasoningDetailServerToolCall" +--- + +Record of an OpenRouter server-tool invocation (e.g. openrouter:fusion), carried in reasoning_details so a prior tool call can be rehydrated into a later turn of the same conversation. + + +## Fields + +| Field | Type | Required | Description | Example | +| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | +| `arguments` | *str* | :heavy_check_mark: | N/A | | +| `format_` | [OptionalNullable[components.ReasoningFormat]](../components/reasoningformat.mdx) | :heavy_minus_sign: | N/A | unknown | +| `id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | +| `index` | *Optional[int]* | :heavy_minus_sign: | N/A | | +| `result` | *str* | :heavy_check_mark: | N/A | | +| `tool_call_id` | *OptionalNullable[str]* | :heavy_minus_sign: | N/A | | +| `tool_name` | *str* | :heavy_check_mark: | N/A | | +| `type` | [components.ReasoningDetailServerToolCallType](../components/reasoningdetailservertoolcalltype.mdx) | :heavy_check_mark: | N/A | | \ No newline at end of file diff --git a/docs/components/reasoningdetailservertoolcalltype.mdx b/docs/components/reasoningdetailservertoolcalltype.mdx new file mode 100644 index 00000000..cb6b4d64 --- /dev/null +++ b/docs/components/reasoningdetailservertoolcalltype.mdx @@ -0,0 +1,15 @@ +--- +title: "ReasoningDetailServerToolCallType" +--- + +## Example Usage + +```python +from openrouter.components import ReasoningDetailServerToolCallType +value: ReasoningDetailServerToolCallType = "reasoning.server_tool_call" +``` + + +## Values + +- `"reasoning.server_tool_call"` diff --git a/docs/components/reasoningdetailunion.mdx b/docs/components/reasoningdetailunion.mdx index 49ac02be..19039845 100644 --- a/docs/components/reasoningdetailunion.mdx +++ b/docs/components/reasoningdetailunion.mdx @@ -13,6 +13,12 @@ Reasoning detail union schema value: components.ReasoningDetailEncrypted = /* values here */ ``` +### `components.ReasoningDetailServerToolCall` + +```python +value: components.ReasoningDetailServerToolCall = /* values here */ +``` + ### `components.ReasoningDetailSummary` ```python diff --git a/pyproject.toml b/pyproject.toml index e6ead548..f0cbdaa8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "openrouter" -version = "0.11.12" +version = "0.11.13" 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 9208d774..150a77b0 100644 --- a/src/openrouter/_version.py +++ b/src/openrouter/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "openrouter" -__version__: str = "0.11.12" +__version__: str = "0.11.13" __openapi_doc_version__: str = "1.0.0" __gen_version__: str = "2.914.0" -__user_agent__: str = "speakeasy-sdk/python 0.11.12 2.914.0 1.0.0 openrouter" +__user_agent__: str = "speakeasy-sdk/python 0.11.13 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 b5563aa8..397ffe2e 100644 --- a/src/openrouter/components/__init__.py +++ b/src/openrouter/components/__init__.py @@ -2209,6 +2209,11 @@ ReasoningDetailEncryptedType, ReasoningDetailEncryptedTypedDict, ) + from .reasoningdetailservertoolcall import ( + ReasoningDetailServerToolCall, + ReasoningDetailServerToolCallType, + ReasoningDetailServerToolCallTypedDict, + ) from .reasoningdetailsummary import ( ReasoningDetailSummary, ReasoningDetailSummaryType, @@ -4253,6 +4258,9 @@ "ReasoningDetailEncrypted", "ReasoningDetailEncryptedType", "ReasoningDetailEncryptedTypedDict", + "ReasoningDetailServerToolCall", + "ReasoningDetailServerToolCallType", + "ReasoningDetailServerToolCallTypedDict", "ReasoningDetailSummary", "ReasoningDetailSummaryType", "ReasoningDetailSummaryTypedDict", @@ -6386,6 +6394,9 @@ "ReasoningDetailEncrypted": ".reasoningdetailencrypted", "ReasoningDetailEncryptedType": ".reasoningdetailencrypted", "ReasoningDetailEncryptedTypedDict": ".reasoningdetailencrypted", + "ReasoningDetailServerToolCall": ".reasoningdetailservertoolcall", + "ReasoningDetailServerToolCallType": ".reasoningdetailservertoolcall", + "ReasoningDetailServerToolCallTypedDict": ".reasoningdetailservertoolcall", "ReasoningDetailSummary": ".reasoningdetailsummary", "ReasoningDetailSummaryType": ".reasoningdetailsummary", "ReasoningDetailSummaryTypedDict": ".reasoningdetailsummary", diff --git a/src/openrouter/components/reasoningdetailservertoolcall.py b/src/openrouter/components/reasoningdetailservertoolcall.py new file mode 100644 index 00000000..4487eb0e --- /dev/null +++ b/src/openrouter/components/reasoningdetailservertoolcall.py @@ -0,0 +1,84 @@ +"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.""" + +from __future__ import annotations +from .reasoningformat import ReasoningFormat +from openrouter.types import ( + BaseModel, + Nullable, + OptionalNullable, + UNSET, + UNSET_SENTINEL, +) +import pydantic +from pydantic import model_serializer +from typing import Literal, Optional +from typing_extensions import Annotated, NotRequired, TypedDict + + +ReasoningDetailServerToolCallType = Literal["reasoning.server_tool_call",] + + +class ReasoningDetailServerToolCallTypedDict(TypedDict): + r"""Record of an OpenRouter server-tool invocation (e.g. openrouter:fusion), carried in reasoning_details so a prior tool call can be rehydrated into a later turn of the same conversation.""" + + arguments: str + result: str + tool_name: str + type: ReasoningDetailServerToolCallType + format_: NotRequired[Nullable[ReasoningFormat]] + id: NotRequired[Nullable[str]] + index: NotRequired[int] + tool_call_id: NotRequired[Nullable[str]] + + +class ReasoningDetailServerToolCall(BaseModel): + r"""Record of an OpenRouter server-tool invocation (e.g. openrouter:fusion), carried in reasoning_details so a prior tool call can be rehydrated into a later turn of the same conversation.""" + + arguments: str + + result: str + + tool_name: str + + type: ReasoningDetailServerToolCallType + + format_: Annotated[ + OptionalNullable[ReasoningFormat], pydantic.Field(alias="format") + ] = UNSET + + id: OptionalNullable[str] = UNSET + + index: Optional[int] = None + + tool_call_id: OptionalNullable[str] = UNSET + + @model_serializer(mode="wrap") + def serialize_model(self, handler): + optional_fields = set(["format", "id", "index", "tool_call_id"]) + nullable_fields = set(["format", "id", "tool_call_id"]) + 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)) + is_nullable_and_explicitly_set = ( + k in nullable_fields + and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member + ) + + if val != UNSET_SENTINEL: + if ( + val is not None + or k not in optional_fields + or is_nullable_and_explicitly_set + ): + m[k] = val + + return m + + +try: + ReasoningDetailServerToolCall.model_rebuild() +except NameError: + pass diff --git a/src/openrouter/components/reasoningdetailunion.py b/src/openrouter/components/reasoningdetailunion.py index 78e5924e..17b25342 100644 --- a/src/openrouter/components/reasoningdetailunion.py +++ b/src/openrouter/components/reasoningdetailunion.py @@ -5,6 +5,10 @@ ReasoningDetailEncrypted, ReasoningDetailEncryptedTypedDict, ) +from .reasoningdetailservertoolcall import ( + ReasoningDetailServerToolCall, + ReasoningDetailServerToolCallTypedDict, +) from .reasoningdetailsummary import ( ReasoningDetailSummary, ReasoningDetailSummaryTypedDict, @@ -25,6 +29,7 @@ ReasoningDetailSummaryTypedDict, ReasoningDetailEncryptedTypedDict, ReasoningDetailTextTypedDict, + ReasoningDetailServerToolCallTypedDict, ], ) r"""Reasoning detail union schema""" @@ -42,6 +47,7 @@ class UnknownReasoningDetailUnion(BaseModel): _REASONING_DETAIL_UNION_VARIANTS: dict[str, Any] = { "reasoning.encrypted": ReasoningDetailEncrypted, + "reasoning.server_tool_call": ReasoningDetailServerToolCall, "reasoning.summary": ReasoningDetailSummary, "reasoning.text": ReasoningDetailText, } @@ -50,6 +56,7 @@ class UnknownReasoningDetailUnion(BaseModel): ReasoningDetailUnion = Annotated[ Union[ ReasoningDetailEncrypted, + ReasoningDetailServerToolCall, ReasoningDetailSummary, ReasoningDetailText, UnknownReasoningDetailUnion, diff --git a/uv.lock b/uv.lock index f4b684ed..8ffa6380 100644 --- a/uv.lock +++ b/uv.lock @@ -213,7 +213,7 @@ wheels = [ [[package]] name = "openrouter" -version = "0.11.12" +version = "0.11.13" source = { editable = "." } dependencies = [ { name = "httpcore" }, From 1cef91d08841fccfc87cee4f5312f98a5a7e5802 Mon Sep 17 00:00:00 2001 From: "speakeasy-github[bot]" <128539517+speakeasy-github[bot]@users.noreply.github.com> Date: Thu, 9 Jul 2026 17:13:33 +0000 Subject: [PATCH 2/2] empty commit to trigger [run-tests] workflow