Repository navigation
feat!: regenerate SDK for API 2026-09-30 with simba-3.5 - #38
Merged
Merged
Conversation
…rom main Conflicts resolved by rule: every Fern-generated file comes from sdk-release (840e0cb regeneration); every .fernignore-listed file and the release-please state (pyproject [tool.poetry].version, .fern/metadata.json sdkVersion) comes from main.
pydantic 2.14 (the lockfile's version) makes mypy report var-annotated on the two module-level TypeAdapter instances, which failed the release-please job. These are the exact lines Fern's python generator emits from 5.39.2, which SpeechifyInc/speechify-api moves to, so the next regeneration leaves them as they are. Constraining pydantic below 2.14 would have narrowed users' runtime dependency to work around our own type check.
…ve, examples use simba-3.5 client.audio.stream_input does not exist: the python generator only builds websocket clients with should_generate_websocket_clients, but its README feature list documented the AsyncAPI channel anyway. SpeechifyInc/speechify-api now sets readme.disabledSections: [websockets], and this is exactly the README that setting generates. The speech, stream and voices examples move to simba-3.5, the recommended model, as the spec's examples do.
Covers what no generated test does: a client built with defaults sends audio.speech to https://api.speechify.ai, every resource client sends the same Speechify-Version, and a keyless client sends no Authorization header (POST /v1/audio/watermark/verify takes no credentials).
vitalragaz
marked this pull request as draft
October 27, 2026 15:48
Regenerated from SpeechifyInc/speechify-api#4744's spec, which renames the AsyncAPI server from production to websocket. The same spec declares 413 on the synthesis operations, so audio calls now raise ContentTooLargeError. tests/custom/test_client.py pins the environment, reads a with-timestamps stream framed as the API writes it into the declared SpeechStreamEvent_* classes, and checks the 413.
vitalragaz
marked this pull request as ready for review
October 27, 2026 16:11
Generated by Fern CLI Version: unknown Generators: - fernapi/fern-python-sdk: 5.41.10
…kept files from this branch Generated files come from Fern's regeneration of SpeechifyInc/speechify-api main (14383dab, python generator 5.41.10). Hand-kept files stay as this branch has them: AGENTS.md, README.md and reference.md (the simba-3.5 examples), tests/custom/test_client.py and its .fernignore line. README takes the generator's "timeout" request option, which 5.41.10 adds (timeout_in_seconds stays as a deprecated alias). pyproject.toml and .fern/metadata.json keep 4.0.0, so release-please computes 5.0.0; the PEP 639 license fields are the generator's output for license: MIT.
Generator 5.41.10 resolves the token at construction instead of in a default argument evaluated at import, so a key set after `import speechify` is used. An explicit token still wins, a keyless client sends no Authorization header, and an authenticated call without a key raises UnauthorizedError.
This was referenced Oct 27, 2026
Closed
vitalragaz
pushed a commit
that referenced
this pull request
Oct 29, 2026
🤖 I have created a release *beep* *boop* --- ## [5.0.0](4.0.0...5.0.0) (2026-10-29) ### ⚠ BREAKING CHANGES * API version 2026-09-30 is the default, SpeechifyEnvironment is a class with base and websocket URLs, and base_url is removed. See PR #38 for the migration. ### Features * regenerate SDK for API 2026-09-30 with simba-3.5 ([62f7ef7](62f7ef7)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
speechify-apicatches up with the API: simba-3.5, projects, workspaces, audio watermark verification and webhook endpoints, with API version 2026-09-30 as the default. Merging releases 5.0.0.Why: Fern pushed every regeneration since August to
sdk-releaseand nobody merged it, so 4.0.0 predates simba-3.5. This branch mergessdk-release, then takes every generated file from Fern's own regeneration of SpeechifyInc/speechify-api main (#39: python generator 5.41.10, origin14383dab) and keeps this branch's hand-kept files. Future regenerations arrive as PRs like #39.What to look at
SpeechifyEnvironment.DEFAULThasbaseandwebsocket. The WebSocket URL used to be calledproductionbecause of the AsyncAPI server's name. SpeechifyInc/speechify-api#4744 renames that server, so the name is right in the same major that turns the environment into a class.ContentTooLargeErroron 413, because the spec declares it on the synthesis operations. With-timestamps streaming still yields the declaredSpeechStreamEvent_*classes, and a test pins that.SPEECHIFY_API_KEYwhen it is built, not at import. Generator 5.41.10 resolves the token in the constructor, so a key set afterimport speechify(for example byload_dotenv()) is used. An explicittoken=still wins. This is fix(auth): resolve environment token when constructing clients (proof of concept) #34's fix, now from the generator.POST /v1/audio/watermark/verifytakes no credentials, so a keyless client has to be able to call it. Without a key, the first authenticated call raisesUnauthorizedError(401unauthorized). Proposed follow-up in speechify-api: make that 401 message nameSPEECHIFY_API_KEY.stream_reconnection_enabled,max_stream_reconnection_attempts) on the client and per request, atimeoutrequest option (timeout_in_secondsstays as a deprecated alias), opt-inretry_remote_protocol_errors, empty SSE data lines skipped, and mypy passing under pydantic 2.14 natively, so the earlier hand patch is gone.pyproject.tomllicense is the generator's PEP 639 form ([project] license = "MIT",license-files). Poetry 1.5.1, which publishes, still writesLicense: MITand the MIT classifier; current poetry-core writesLicense-Expression: MIT. The version stays 4.0.0, so release-please computes 5.0.0.client.audio.stream_input, which this SDK does not have. Examples use simba-3.5, matching what SpeechifyInc/speechify-api#4741's spec generates, and the timeout example usestimeout.tests/custom/test_client.py(hand-kept, in.fernignore): offline tests of a client built with defaults, sync and async. Environment, URL, Bearer header, oneSpeechify-Versionacross resource clients, a with-timestamps stream framed as the API writes it, the 413, noAuthorizationwithout a key, the 401 without a key, a key set after import being used, and an explicit token beating the environment.Merge order and follow-ups
sdk-releasetomain, or delete it.How verified
d280838(Python 3.10, Poetry 1.5.1):compile(mypy) andtestpass.pytest103 passed, 3 skipped (aiohttp not installed; 106 passed with the extra).mypy .: no issues in 176 files.client.pyand pass on 5.41.10.Speechify()with the key set after import sendsaudio.speech()tohttps://api.speechify.ai/v1/audio/speechwith the Bearer header andSpeechify-Version: 2026-09-30.request_options={"timeout": 1}reaches httpx as a 1 s timeout.models.list()andaudio.speech()raiseUnauthorizedError401{"error":{"code":"unauthorized","message":"Unauthorized"}}.audio.watermark.verify()answerswatermarked=False.AGENTS.md,README.md,reference.md,.fernignore,tests/custom/test_client.py, and the 4.0.0 version inpyproject.tomland.fern/metadata.json.Investigation detail
48cb2c9: every generated path checked out fromfern-bot/2026-10-27_16-45-54_696(33e10e7), hand-kept files from this branch. Fern's.fern/replay.lock,.gitattributesand their.fernignorelines are in;tests/custom/test_client.pystays in.fernignore.poetry build(1.5.1) givesLicense: MIT,Classifier: License :: OSI Approved :: MIT LicenseandLICENSEin dist-info.python -m buildwith poetry-core 2.5.0 givesMetadata-Version: 2.4,License-Expression: MIT,License-File: LICENSE.twine checkpasses both.x-fern-discriminator-context: protocolto the stream union for the TypeScript SDK. In Python that yieldsSpeechChunkEvent/SpeechDoneEventcast to theSpeechStreamEvent_*union, soisinstancechecks fail. The annotation was dropped, and the stream test fails if it comes back.ConflictError, as the spec declares.BREAKING CHANGE: the default API version moves to 2026-09-30,
base_urlis gone, andSpeechifyEnvironmentis a class withbaseandwebsocket.Speechify-Version: 2026-09-30instead of 2026-09-13. On that versionsimba-englishandsimba-multilingualreturn 400model_retired, andoutput_format="pcm_16000"returns real 16 kHz audio instead of 24 kHz bytes labelled 16 kHz.Speechify(version="2026-09-13")Speechify(base_url=...)andAsyncSpeechify(base_url=...)are removed. For a custom URL, passenvironment=SpeechifyEnvironment(base="https://...", websocket="wss://...").SpeechifyEnvironmentis a plain class, not anEnum, soSpeechifyEnvironment.DEFAULT.valuebecomesSpeechifyEnvironment.DEFAULT.base.UnauthorizedErrorinstead.BEGIN_COMMIT_OVERRIDE
feat!: regenerate SDK for API 2026-09-30 with simba-3.5
BREAKING CHANGE: API version 2026-09-30 is the default, SpeechifyEnvironment is a class with base and websocket URLs, and base_url is removed. See PR #38 for the migration.
END_COMMIT_OVERRIDE