Skip to content

[pull] main from fern-api:main - #908

Merged
pull[bot] merged 33 commits into
code:mainfrom
fern-api:main
Aug 20, 2026
Merged

[pull] main from fern-api:main#908
pull[bot] merged 33 commits into
code:mainfrom
fern-api:main

Conversation

@pull

@pull pull Bot commented Aug 20, 2026

Copy link
Copy Markdown

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 : )

fern-api Bot and others added 30 commits August 20, 2026 18:10
* 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>
fern-api Bot and others added 3 commits August 20, 2026 17:28
)

Co-authored-by: fern-api[bot] <115122769+fern-api[bot]@users.noreply.github.com>
Co-authored-by: Dak <dakshesh@buildwithfern.com>
@pull pull Bot locked and limited conversation to collaborators Aug 20, 2026
@pull pull Bot added the ⤵️ pull label Aug 20, 2026
@pull
pull Bot merged commit c53bafb into code:main Aug 20, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants