[pull] main from fern-api:main - #908
Merged
Merged
Conversation
* fix(go): pass OAuth client credentials in generated wire tests * chore(go): regenerate oauth-client-credentials seed snapshot --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
…e-runnable (#17472) The vendored generators/cli/sdk/Cargo.lock ships verbatim into every generated CLI, so a stale pin there reaches every consumer. Two advisories were live in it: RUSTSEC-2026-0258 (h2 <0.4.16) and RUSTSEC-2026-0257 (webbrowser <1.2.2). Refreshed both, plus the transitive additions webbrowser pulls in. No other package moved. The generated release.yml ended in a bare `gh release create`, so a release that already existed for the tag — cut from the GitHub UI, or a re-run of a failed `host` job — failed the release after every build had already succeeded. The step now checks `gh release view` first and edits + uploads into an existing release, creating only when there is none. `--draft=false` publishes a release drafted in the UI, since `gh release view` finds drafts and without it the assets upload somewhere nobody can see while the job reports success; `--target` puts the tag on the built commit, since a draft has no tag yet. Added the cargo ecosystem to .github/dependabot.yml for the vendored SDK. The repo already covers npm and gomod; this is the gap that let the advisories rot. Preferred over a scheduled cargo-audit job because Dependabot opens a PR with the fix rather than turning a cron red with no owner. An earlier revision also added a Cargo.lock merge inside the generator, to stop regeneration discarding a customer's dependency upgrades. It was dropped: the generator's /fern/output is a freshly mkdir'd temp directory (runGenerator.ts:170-172), not the customer's repo, so it never sees a prior lockfile and the merge is a no-op in every flow. The clobbering happens in the CLI's copy-back step. Letting generators read prior output is a cross-cutting change to the CLI/generator contract and wants an ADR. Co-authored-by: Rishabh Dhadda <rishabh.dhadda@postman.com> Co-authored-by: Claude <noreply@anthropic.com>
* feat(python-sdk): add `stream_abstraction` for SSE event metadata
Python SDKs had no equivalent of the TypeScript `core.Stream`. For an SSE
endpoint the generated `_iter()` consumed the `ServerSentEvent` and yielded only
the parsed model, so the event `id` was unreachable — `with_raw_response` did
not help either, since `r.data` is that same generator and `HttpResponse`
exposed no public accessor for the httpx response. Users were left reaching into
`r._response` and re-implementing the casting themselves.
With `stream_abstraction` enabled, streaming endpoints return a `Stream[T]`
(`AsyncStream[T]` for async clients). The stream still iterates as the parsed
payloads, and `with_metadata()` yields them wrapped in a `StreamEvent` exposing
the SSE `id`, `event` and `retry`:
for event in client.completions.stream(...).with_metadata():
print(event.id, event.data)
The request is still only issued once the stream is iterated, preserving today's
error timing, and the stream owns the response — released on exhaustion, on
error, via `close()`, and as a (async) context manager. Defaults to `false`, so
signatures and snippets are unchanged until you opt in.
Ungated alongside it:
- `HttpResponse`/`AsyncHttpResponse` expose the underlying `httpx.Response`
through a public `response` property.
- SSE frames carrying no data (comment-only and retry-only frames, both legal)
are skipped rather than parsed as a payload, which previously failed model
construction and logged a warning.
- The generated async examples for streaming endpoints no longer `await` the
call, which raised `TypeError: 'async_generator' object can't be awaited`.
Fixed in both the v1 docstring path and the v2 README builder.
Reported by TrueFoundry (Pylon #22957).
Co-Authored-By: Devin <devin-ai-integration[bot]@users.noreply.github.com>
Co-Authored-By: Claude <noreply@anthropic.com>
* chore(python): satisfy ruff-format
---------
Co-authored-by: Fern Support <support@buildwithfern.com>
Co-authored-by: Devin <devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
…sors (#17483) * fix(go): an empty string terminates cursor pagination for aliased cursors Co-Authored-By: bot_apk <apk@cognition.ai> * test(go): pin nullable string alias cursor termination Co-Authored-By: bot_apk <apk@cognition.ai> --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: bot_apk <apk@cognition.ai>
…int in wire test stubs (#17492) Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
…17438) * fix(typescript): honor x-fern-retries disabled at the endpoint level * chore(typescript): address review feedback on retries-disabled change --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com> Co-authored-by: Dak <dakshesh@buildwithfern.com>
Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(php): honor x-fern-retries disabled at the endpoint level * chore(php): type retries helpers as Pick<HttpEndpoint, "retries"> --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
* fix(java): honor x-fern-retries disabled at the endpoint level * style(java): satisfy spotless formatting for retries-disabled change * style(java): apply spotless formatting to retries test * chore(java): regenerate no-retries seed output * refactor(java): extract MaxRetriesOverride class name helper --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
* fix(go): honor x-fern-retries disabled at the endpoint level * chore(go): collapse the disabled-retries check into one helper --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
* fix(rust): disable retries for endpoints with retries.disabled * test(rust): assert generated client output without type assertions * test(rust): build IR fixtures via serialization parsers --------- Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
* fix(swift): do not retry endpoints with retries disabled
Endpoints with retries: { disabled: true } now pass retriesDisabled: true to the generated HTTPClient, which forces zero retry attempts regardless of client- or request-level maxRetries.
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* fix(swift): skip generated retry tests for endpoints with retries disabled
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* chore(swift): sort imports
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
* test(swift): assert retries-disabled endpoints do not retry in seed
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
---------
Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Dak <dakshesh@buildwithfern.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 subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )