-
Notifications
You must be signed in to change notification settings - Fork 308
Expand file tree
/
Copy pathversions.yml
More file actions
4108 lines (3632 loc) · 132 KB
/
versions.yml
File metadata and controls
4108 lines (3632 loc) · 132 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# yaml-language-server: $schema=../../../fern-versions-yml.schema.json
# For unreleased changes, use unreleased.yml
- version: 5.0.3
changelogEntry:
- summary: |
Skip Docker container management in generated `tests/conftest.py` when the
`WIREMOCK_URL` environment variable is already set. This allows wire tests to
run in CI/CD pipelines that provide an external WireMock sidecar container
without requiring Docker-in-Docker support.
type: fix
createdAt: "2026-03-17"
irVersion: 65
- version: 5.0.2
changelogEntry:
- summary: |
Add docstring emission for unknown/any type alias definitions. When a type alias
resolves to `typing.Any` and has a description in the API definition, the generated
Python code now includes the docstring below the type alias declaration.
type: fix
createdAt: "2026-03-17"
irVersion: 65
- version: 5.0.1
changelogEntry:
- summary: |
Upgrade `pytest-asyncio` dev dependency from `^0.23.5` to `^1.0.0` in generated
`pyproject.toml`. This eliminates deprecation warnings about `asyncio.iscoroutinefunction`,
`asyncio.get_event_loop_policy`, and `asyncio.set_event_loop_policy` when running tests
on Python 3.14+.
type: chore
createdAt: "2026-03-16"
irVersion: 65
- version: 5.0.0
changelogEntry:
- summary: |
Raise the default minimum Python version from `^3.8` to `^3.10` in generated
`pyproject.toml`. This allows the dependency resolver to pick Pydantic 2.11+ and
pydantic-core 2.33+, which ship pre-built wheels for Python 3.14, fixing
installation failures on Python 3.14.
type: feat
createdAt: "2026-03-16"
irVersion: 65
- version: 4.64.1
changelogEntry:
- summary: |
Wrap `python-version` in quotes in generated GitHub CI workflow so versions like
`^3.10` are not misinterpreted as `3.1` by the YAML parser.
type: fix
createdAt: "2026-03-16"
irVersion: 65
- version: 4.64.0
changelogEntry:
- summary: |
Add `omit_fern_headers` configuration option. When enabled, Fern platform headers
(X-Fern-Language, X-Fern-SDK-Name, X-Fern-SDK-Version, X-Fern-Runtime,
X-Fern-Platform, User-Agent) are omitted from generated SDK requests.
type: feat
createdAt: "2026-03-12"
irVersion: 65
- version: 4.63.6
changelogEntry:
- summary: |
Fix wire test generation for types with required fields missing from examples.
When an OpenAPI example omits required fields on a nested object type, the generated
test code now synthesizes reasonable default values (e.g., `""` for strings, `1` for
integers, `[]` for lists) instead of emitting empty constructors like `ClassName()`
that cause Pydantic `ValidationError` at runtime.
type: fix
createdAt: "2026-03-12"
irVersion: 65
- version: 4.63.5
changelogEntry:
- summary: |
Fix Python 3.14 compatibility by fully eliminating all `pydantic.v1` imports from the
Pydantic V2 code path. The previous fix (4.55.4) replaced `pydantic.v1.datetime_parse`
but left other `pydantic.v1` imports (typing utilities, json encoders, fields) that still
trigger the "Core Pydantic V1 functionality isn't compatible with Python 3.14" warning.
All `pydantic.v1` usages are now replaced with standard library equivalents
(`typing.get_args`, `typing.get_origin`, `typing_extensions.Literal`), Pydantic V2 APIs
(`pydantic.fields.FieldInfo`), and an inlined `encoders_by_type` dictionary.
type: fix
createdAt: "2026-03-11"
irVersion: 65
- version: 4.63.4
changelogEntry:
- summary: |
Add concurrency configuration to generated CI workflow with cancel-in-progress: false
to prevent stacked runs from being cancelled when a newer run starts.
type: chore
createdAt: "2026-03-11"
irVersion: 65
- version: 4.63.3
changelogEntry:
- summary: |
Make wire test datetime normalization type-aware. String-typed query parameters
that look like datetimes (e.g., `created_after: str`) are no longer incorrectly
normalized with `.000` milliseconds. Only `DATE_TIME`-typed parameters are affected
by the `datetime_milliseconds` config.
type: fix
createdAt: "2026-03-11"
irVersion: 65
- version: 4.63.2
changelogEntry:
- summary: |
Fix wire test datetime format mismatch. When `datetime_milliseconds` is false (default),
WireMock stubs are now stripped of `.000` milliseconds to match the SDK's default
`serialize_datetime` output. When true, test verification values include `.000` to match
millisecond-precision output. Fixes wire test failures for APIs with datetime query parameters.
type: fix
createdAt: "2026-03-10"
irVersion: 65
- version: 4.63.1
changelogEntry:
- summary: |
Fix socket client generation to use keyword arguments when calling `construct_type`.
type: fix
createdAt: "2026-03-10"
irVersion: 65
- version: 4.63.0
changelogEntry:
- summary: |
Add `datetime_milliseconds` custom config option. When set to `true`,
`serialize_datetime` always includes millisecond precision in ISO 8601 output
(e.g., `2008-01-02T00:00:00.000Z` instead of `2008-01-02T00:00:00Z`).
Useful for APIs that require a fixed-width datetime format with fractional seconds.
Default behavior is unchanged.
type: feat
createdAt: "2026-03-10"
irVersion: 65
- version: 4.62.4
changelogEntry:
- summary: |
Re-throw errors after logging for README.md and reference.md generation failures.
Documentation generation errors now break the generation flow so they are treated
as important to fix.
type: fix
createdAt: "2026-03-10"
irVersion: 65
- version: 4.62.3
changelogEntry:
- summary: |
Fix dynamic snippets to include global headers in generated code examples.
Previously, required global headers (e.g., `X-Organization-ID`) configured via
`x-fern-global-headers` were missing from dynamic snippet output. Also fixes
header value lookup to use wire values instead of a non-existent property.
type: fix
createdAt: "2026-03-10"
irVersion: 65
- version: 4.62.2
changelogEntry:
- summary: |
Improve error logging for reference.md generation failures. The generator
now logs the actual error message and stack trace instead of a generic
"this is OK" message, making it easier to diagnose generation issues.
type: chore
createdAt: "2026-03-09"
irVersion: 65
- version: 4.62.1
changelogEntry:
- summary: |
SDK clients now catch `pydantic.ValidationError` during response parsing and
wrap it in `ParsingError` with the response body, headers, status code and cause. Previously,
validation errors from `parse_obj_as` would bubble up raw, preventing users from
inspecting the actual API response.
type: fix
createdAt: "2026-03-06"
irVersion: 65
- version: 4.62.0
changelogEntry:
- summary: |
Add `README.md` and `reference.md` generation to the python-v2 SDK generator.
The v2 generator now produces README documentation with feature snippets
(installation, usage, timeouts, custom client, exception handling, raw responses,
websockets, custom sections) and endpoint reference documentation.
type: feat
- summary: |
Format AST output with trailing commas in multiline function calls and
inline list/dict formatting for improved code readability.
type: chore
createdAt: "2026-03-05"
irVersion: 65
- version: 4.61.5
changelogEntry:
- summary: |
Fix WebSocket client generation to respect `pydantic_config.skip_validation: true`.
Previously, socket clients always used `parse_obj_as` (full Pydantic validation)
regardless of the skip_validation flag. They now correctly use `construct_type`
(no validation) when the flag is enabled, matching the behavior of HTTP clients.
type: fix
createdAt: "2026-03-05"
irVersion: 65
- version: 4.61.4
changelogEntry:
- summary: |
WebSocket clients now gracefully handle unknown message types instead of crashing.
When the server sends a message type not yet in the SDK's union, the client logs a
warning and skips the message rather than killing the connection with a validation error.
type: fix
createdAt: "2026-03-04"
irVersion: 65
- version: 4.61.3
changelogEntry:
- summary: |
Standardize WireMock configuration to use `WIREMOCK_URL` environment variable
(e.g., `http://localhost:8080`) instead of `WIREMOCK_PORT`. The conftest plugin
now sets `WIREMOCK_URL` after discovering the dynamically assigned port. Falls
back to `http://localhost:8080` if the variable is not set.
type: chore
createdAt: "2026-03-02"
irVersion: 65
- version: 4.61.2
changelogEntry:
- summary: |
Re-add `@fern-api/generator-cli` to Python SDK Docker image. The CLI was inadvertently
removed in 4.60.1 when JS-based generators migrated to using the generator-cli JS API
directly. The Python generator still relies on the CLI binary via subprocess for
README.md and reference.md generation.
type: fix
createdAt: "2026-02-27"
irVersion: 65
- version: 4.61.1
changelogEntry:
- summary: |
Fix `positional_single_property_constructors` breaking pydantic response deserialization.
The custom `__init__` now uses `@typing.overload` with a permissive `*args, **kwargs` runtime
signature, so pydantic can pass alias-keyed data freely during deserialization while still
allowing positional construction like `Wrapper("value")`.
type: fix
createdAt: "2026-02-27"
irVersion: 65
- version: 4.61.0
changelogEntry:
- summary: |
Add support for `DATE_TIME_RFC_2822` primitive type. Fields with `format: date-time-rfc-2822`
in OpenAPI specs now generate as `Rfc2822DateTime` (a `datetime.datetime` subclass) that
parses RFC 2822 date strings (e.g., "Wed, 02 Oct 2002 13:00:00 GMT") using Python's
`email.utils.parsedate_to_datetime`. Compatible with both Pydantic V1 (`__get_validators__`)
and V2 (`__get_pydantic_core_schema__`), passing mypy strict type checking.
type: feat
- summary: |
Fix code snippet generation for RFC 2822 datetime fields to use
`email.utils.parsedate_to_datetime()` with RFC 2822 format strings instead of
`datetime.fromisoformat()` with ISO 8601 format.
type: fix
createdAt: "2026-02-26"
irVersion: 65
- version: 4.60.2
changelogEntry:
- summary: |
Fix `explode: false` query parameter serialization for array types. When an OpenAPI spec
sets `explode: false` on an array query parameter, the generated SDK now serializes values
as comma-separated strings (e.g. `tags=A,B,C`) instead of repeated keys (e.g. `tags=A&tags=B&tags=C`).
This applies to both regular and streaming endpoints.
type: fix
createdAt: "2026-02-26"
irVersion: 65
- version: 4.60.1
changelogEntry:
- summary: |
Use generator-cli JS API directly instead of subprocess spawning.
Remove generator-cli from Docker image since it is now bundled via esbuild.
type: chore
createdAt: "2026-02-26"
irVersion: 65
- version: 4.60.0
changelogEntry:
- summary: |
Support `connectMethodName` on WebSocket channels. When a channel specifies a custom
connection method name via `x-fern-sdk-method-name`, the generated SDK uses that name
(converted to snake_case) instead of the default `connect`.
type: feat
createdAt: "2026-02-25"
irVersion: 65
- version: 4.59.4
changelogEntry:
- summary: |
Fix wire test import generation for organizations with hyphens in their name.
Use `package_name` from custom config when available, and auto-convert hyphens
to underscores in the fallback module path to produce valid Python import statements.
type: fix
createdAt: "2026-02-25"
irVersion: 65
- version: 4.59.3
changelogEntry:
- summary: Fix bytes body snippet generation to use `request` parameter name instead of dynamic IR body key.
type: fix
- summary: Skip wire test generation for bytes request body endpoints, which lack IR example support.
type: fix
createdAt: "2026-02-24"
irVersion: 65
- version: 4.59.2
changelogEntry:
- summary: |
Generate an appropriate `client.py` file when `client.exported_filename` differs from `client.filename`.
Previously, the `__init__.py` would import from the exported filename (e.g., `client.py`) but
that file was never created, causing mypy `import-not-found` errors.
type: fix
createdAt: "2026-02-20"
irVersion: 65
- version: 4.59.1
changelogEntry:
- summary: Fix wire test imports to respect package_name custom config, preventing import errors when users specify custom package names
type: fix
createdAt: "2026-02-23"
irVersion: 65
- version: 4.59.0
changelogEntry:
- summary: |
Add `offsetSemantics` custom config option. When set to `"page-index"`, offset pagination
increments by 1 each page instead of by the number of items returned (`"item-index"`, the default).
type: feat
createdAt: "2026-02-17"
irVersion: 65
- version: 4.58.1
changelogEntry:
- summary: |
Export `ConsoleLogger` and `ILogger` from the `core` module, allowing users to import
and use them directly:
```python
from acme.core import ConsoleLogger, ILogger
```
type: fix
createdAt: "2026-02-18"
irVersion: 65
- version: 4.58.0
changelogEntry:
- summary: |
Add support for logging to the generated SDK.
Users can configure the logger by passing in a `logging` parameter to the client constructor.
```python
from acme import AcmeClient
from acme.core import ConsoleLogger
client = AcmeClient(
token="YOUR_TOKEN",
logging={
"level": "debug", # "info" is the default
"logger": ConsoleLogger(), # ConsoleLogger is the default
"silent": False, # True is the default, set to False to enable logging
}
)
```
The `logging` parameter accepts a `LogConfig` dict with the following properties:
- `level`: The log level to use. Defaults to `"info"`.
- `logger`: The logger to use. Defaults to `ConsoleLogger`.
- `silent`: Whether to silence the logger. Defaults to `True`.
The `level` property can be one of the following values:
- `"debug"`
- `"info"`
- `"warn"`
- `"error"`
To provide a custom logger, pass an object implementing the `ILogger` protocol
with `debug`, `info`, `warn`, and `error` methods.
Sensitive headers (`authorization`, `x-api-key`, `cookie`, etc.) are automatically
redacted in logs.
type: feat
createdAt: "2026-02-10"
irVersion: 65
- version: 4.57.3
changelogEntry:
- summary: |
Handle optional access tokens in OAuth token provider by raising `RuntimeError`
when the token is `None`. Fix wire test setup to use `client_id`/`client_secret`
for OAuth client credentials and expect 2 requests when testing the token endpoint.
type: fix
createdAt: "2026-02-13"
irVersion: 65
- version: 4.57.2
changelogEntry:
- summary: |
Fix path-based pagination to pass the next page path as `path=` instead of `url=`
in the generated HTTP client request call.
type: fix
createdAt: "2026-02-13"
irVersion: 65
- version: 4.57.1
changelogEntry:
- summary: |
Only copy `custom_pagination.py` into generated SDKs when custom pagination endpoints
are present, and only copy `pagination.py` when standard pagination endpoints are present.
type: fix
createdAt: "2026-02-12"
irVersion: 65
- version: 4.57.0
changelogEntry:
- summary: |
Add `custom_transport: true` generator config option that exposes an `http_client` parameter
on generated client constructors for custom httpx transport injection.
**Primary use case:** Enables PKCE (Proof Key for Code Exchange) OAuth flows and other
authentication schemes that require request interception at the transport layer.
**Configuration:**
```yaml
generators:
- name: fernapi/fern-python-sdk
config:
custom_transport: true
```
**Generated parameter types:**
- Sync client: `http_client: typing.Optional[httpx.BaseTransport]`
- Async client: `http_client: typing.Optional[httpx.AsyncBaseTransport]`
**Use cases:**
- PKCE OAuth authentication flows requiring code challenge/verifier injection
- Custom request signing or authentication header manipulation
- Request/response interception and modification
- Mock transports for testing without network calls
- Custom retry logic beyond the built-in exponential backoff
**Example pattern (Twilio SDK style):**
```python
# SDK developer provides a factory method in custom code
class ValidationClient:
@classmethod
def create(cls, account_sid: str, auth_token: str) -> httpx.BaseTransport:
# Custom transport with PKCE or validation logic
return CustomValidationTransport(account_sid, auth_token)
# End-user usage
from myapi import MyClient, ValidationClient
validation_transport = ValidationClient.create("account_sid", "auth_token")
client = MyClient(http_client=validation_transport, base_url="https://api.example.com")
```
This feature allows SDK developers to defer transport-specific logic to custom code while
the generator simply threads the transport through to `httpx.Client`/`httpx.AsyncClient`.
type: feat
createdAt: "2026-02-12"
irVersion: 65
- version: 4.56.0
changelogEntry:
- summary: |
Add support for URI and path-based pagination.
type: feat
createdAt: "2026-02-11"
irVersion: 65
- version: 4.55.5
changelogEntry:
- summary: |
Compute Docker Compose project name during generation to avoid invalid characters from runtime directory names (e.g. `.seed`).
type: fix
- summary: |
Cache client constructor signature check at module level and use httpx instead of requests for WireMock admin calls in generated wire test conftest.
type: chore
createdAt: "2026-02-11"
irVersion: 63
- version: 4.55.4
changelogEntry:
- summary: |
Fix Python 3.14 compatibility by replacing `pydantic.v1.datetime_parse` imports with
Pydantic V2 `TypeAdapter`-based `parse_date`/`parse_datetime` implementations. Remaining
`pydantic.v1` imports are wrapped with warning suppression to avoid the
"Core Pydantic V1 functionality isn't compatible with Python 3.14" warning.
type: fix
createdAt: "2026-02-09"
irVersion: 63
- version: 4.55.3
changelogEntry:
- summary: |
Fix body property named `json` clashing with the `json` module import when generating
`json.dumps(jsonable_encoder(...))` for multipart file upload requests. The `json` module
is now aliased as `_json` when a body property named `json` is detected.
type: fix
createdAt: "2026-02-09"
irVersion: 63
- version: 4.55.2
changelogEntry:
- summary: |
Add websocket compatibility shim for websockets library v14. The generated SDK now
uses a `core/websocket_compat.py` module that abstracts the `InvalidStatusCode` vs
`InvalidStatus` exception difference, ensuring compatibility with both websockets
v12-13 and v14+.
type: fix
createdAt: "2026-02-09"
irVersion: 63
- version: 4.55.1
changelogEntry:
- summary: |
Adds back intermediate raw_clients which were removed in 4.51.2.
type: fix
createdAt: "2026-02-06"
irVersion: 63
- version: 4.55.0
changelogEntry:
- summary: |
Add support for server URL templating with OpenAPI server variables. This enables
dynamic base URL construction at runtime based on user-provided configuration.
**OpenAPI definition example:**
```yaml
servers:
- url: https://api.{region}.{environment}.example.com/v1
variables:
region:
default: us-east-1
enum: [us-east-1, us-west-2, eu-west-1]
environment:
default: prod
enum: [prod, staging, dev]
```
**Generated constructor parameters:**
Server variables are exposed as optional constructor parameters with their default values:
- `region: typing.Optional[str]` - defaults to `"us-east-1"`
- `server_url_environment: typing.Optional[str]` - defaults to `"prod"` (prefixed to avoid shadowing)
**Runtime URL interpolation:**
When server variables are provided, the SDK performs runtime URL template interpolation:
```python
from seed import SeedApi
# Uses default: https://api.us-east-1.prod.example.com/v1
client = SeedApi()
# Custom region: https://api.eu-west-1.prod.example.com/v1
client = SeedApi(region="eu-west-1")
# Custom region and environment: https://api.us-west-2.staging.example.com/v1
client = SeedApi(region="us-west-2", server_url_environment="staging")
```
**Multiple base URL environments:**
For APIs with multiple base URLs (e.g., separate `base` and `auth` URLs), each URL
template is interpolated independently with the same server variables.
**`x-fern-default-url` extension:**
When present in the OpenAPI spec, this extension specifies which server URL should
be used as the default environment, overriding the first server in the list.
type: feat
createdAt: "2026-02-05"
irVersion: 63
- version: 4.54.4
changelogEntry:
- summary: |
The `use_provided_defaults` config option no longer applies defaults to
inlined request body properties.
type: fix
createdAt: "2026-02-05"
irVersion: 62
- version: 4.54.3
changelogEntry:
- summary: |
Fix mypy type checking compatibility with pydantic field aliases. When fields have aliases
(e.g., `bucket_id` with alias `bucketId`), the pydantic.Field(alias=...) is now placed inside
the Annotated type hint instead of as the default value. This makes mypy see the Python field
name in the constructor signature while Pydantic still uses the alias for JSON serialization.
type: fix
createdAt: "2026-02-03"
irVersion: 62
- version: 4.54.2
changelogEntry:
- summary: |
Generate CI workflow Python versions and PyPI trove classifiers dynamically based on the
`pyproject_python_version` constraint.
type: fix
createdAt: "2026-01-29"
irVersion: 62
- version: 4.54.1
changelogEntry:
- summary: |
Switch from `poetry install` to `poetry lock` after SDK generation. This performs dependency
resolution and saves the lockfile without installing packages, which avoids failures when
transitive dependencies require custom build tools.
type: fix
createdAt: "2026-01-29"
irVersion: 62
- version: 4.54.0
changelogEntry:
- summary: |
Add `status_code` property to `HttpResponse` and `AsyncHttpResponse` classes.
This allows users to access the HTTP status code when using `with_raw_response`.
type: feat
createdAt: "2026-01-29"
irVersion: 62
- version: 4.53.1
changelogEntry:
- summary: |
Fix literal and enum types being incorrectly JSON-serialized in multipart file upload requests.
type: fix
createdAt: "2026-01-28"
irVersion: 62
- version: 4.53.0
changelogEntry:
- summary: |
Add `import_paths` config option to auto-load user-defined files when the SDK is imported.
This enables custom integrations (e.g., Sentry, logging) without modifying generated code.
Files specified in the array (e.g., `["sentry_integration", "custom_logging"]`) are imported
from the package root if they exist, using try/except to gracefully handle missing files.
type: feat
createdAt: "2026-01-26"
irVersion: 62
- version: 4.52.0
changelogEntry:
- summary: |
Add support for inferred authentication. Fixes for wire test generation with inferred auth.
type: feat
createdAt: "2026-01-26"
irVersion: 62
- version: 4.51.3
changelogEntry:
- summary: |
Fix WebSocket methods and iterators to avoid parsing binary messages as JSON.
type: fix
createdAt: "2026-01-27"
irVersion: 62
- version: 4.51.2
changelogEntry:
- summary: |
Skip generating raw client and `with_raw_response` property for intermediate clients that only
have nested clients but no direct endpoints. This reduces unnecessary code generation and makes
the SDK cleaner by only including raw client functionality where it's actually useful.
type: fix
createdAt: "2026-01-26"
irVersion: 62
- version: 4.51.1
changelogEntry:
- summary: |
Fix WebSocket connections to merge `additional_query_parameters` from `request_options`
into the connection URL. Query params now use the same encoding pattern as HTTP endpoints.
type: fix
createdAt: "2026-01-26"
irVersion: 62
- version: 4.51.0
changelogEntry:
- summary: |
Add intelligent SSE parsing for discriminated unions via `parse_sse_obj()`. This function
handles both data-level discrimination (discriminator inside JSON data payload) and
event-level discrimination (discriminator at SSE envelope level). For event-level unions,
it correctly parses the data field based on what the matching variant expects (string vs.
complex object), enabling proper handling of streaming responses with mixed data types.
type: feat
createdAt: "2026-01-26"
irVersion: 62
- version: 4.50.1
changelogEntry:
- summary: |
Fix duplicate imports in __init__.py when using additional_init_exports. When the same
symbol was exported from both the regular types module and additional_init_exports, the
generator would produce duplicate imports causing F811 "Redefinition of unused" ruff errors.
The generator now deduplicates exports, with additional_init_exports taking precedence.
type: fix
createdAt: "2026-01-26"
irVersion: 62
- version: 4.50.0
changelogEntry:
- summary: |
Add `wire_tests` config group with `enabled` and `exclusions` options. The `exclusions` option allows excluding specific endpoints/services from wire test generation using definition-level selectors. The existing `enable_wire_tests` option is now deprecated in favor of `wire_tests.enabled`.
type: feat
createdAt: "2026-01-25"
irVersion: 62
- version: 4.49.0
changelogEntry:
- summary: |
Add `mypy_exclude` custom config option to exclude directories from mypy type checking.
This is useful when `.fernignore` preserves directories (like `legacy/` or `tests/integration/`)
that contain code incompatible with the generated SDK.
type: feat
createdAt: "2026-01-20"
irVersion: 62
- version: 4.48.1
changelogEntry:
- summary: |
Fix WireMock stub generation for streaming endpoints. When an endpoint has both streaming
and non-streaming variants (via x-fern-streaming with stream-condition), the generated
WireMock stubs now include request body matching criteria to differentiate between them.
SSE stubs match on `stream: true` in the request body and have higher priority, ensuring
wire tests correctly route streaming requests to the SSE stub.
type: fix
createdAt: "2026-01-14"
irVersion: 62
- version: 4.48.0
changelogEntry:
- summary: |
Add opt-in `pydantic_config.positional_single_property_constructors` to allow `Wrapper("value")`
for single-required-field models (excluding discriminator literals). Note: can break if the model
later adds required fields; kwargs are more stable.
type: feat
createdAt: "2025-12-18"
irVersion: 62
- version: 4.47.1
changelogEntry:
- summary: Update Dockerfile to use the latest generator-cli with improve reference.md generation.
type: chore
createdAt: "2026-01-13"
irVersion: 62
- version: 4.47.0
changelogEntry:
- summary: |
Add `X-Fern-Runtime` (e.g. `python/3.12.7`) and `X-Fern-Platform` (e.g. `darwin/25.2.0`) telemetry headers to all requests for better runtime/platform observability.
type: feat
createdAt: "2026-01-13"
irVersion: 62
- version: 4.46.14
changelogEntry:
- summary: |
Fix Python wire test generation/runtime robustness for missing examples, OMIT handling, client setup, and multipart file uploads.
type: fix
createdAt: "2026-01-10"
irVersion: 62
- version: 4.46.13
changelogEntry:
- summary: |
Fixes Python SDK import generation to avoid invalid `._` module segments by deriving type paths from canonical declarations.
type: fix
createdAt: "2026-01-09"
irVersion: 62
- version: 4.46.12
changelogEntry:
- summary: |
Support `bytes` as a response type for websocket channel methods.
type: fix
createdAt: "2026-01-09"
irVersion: 62
- version: 4.46.11
changelogEntry:
- summary: |
Wire test generator now skips undefined example values and injects `X-Test-Id` in a constructor-compatible way via `headers` or `httpx_client`.
type: fix
createdAt: "2026-01-09"
irVersion: 62
- version: 4.46.10
changelogEntry:
- summary: |
Fix wire test generation to use endpoint ID for lookup instead of path matching.
This fixes a bug where wire tests would call the wrong client methods when multiple
namespaces have endpoints with the same HTTP method and path pattern (e.g., POST /v2/Services).
type: fix
createdAt: "2026-01-08"
irVersion: 62
- version: 4.46.9
changelogEntry:
- summary: |
Fix wire test generation to filter out nop values when generating method arguments.
This prevents invalid Python syntax like `param=` without a value when an example
contains an invalid enum value or undefined property.
type: fix
createdAt: "2026-01-08"
irVersion: 62
- version: 4.46.8
changelogEntry:
- summary: |
Bump version to remove rc from version tag.
type: fix
createdAt: "2026-01-07"
irVersion: 62
- version: 4.46.7-rc3
changelogEntry:
- summary: |
Fix wire test generation for streaming endpoints. Streaming methods return lazy iterators
(Iterator[bytes] or AsyncIterator[bytes]) that don't execute the HTTP request until iterated.
Wire tests now wrap streaming endpoint calls in 'for _ in ...: pass' loops to ensure the
HTTP request is actually made. This applies to streaming, streamParameter, and fileDownload
response types.
type: fix
createdAt: "2026-01-07"
irVersion: 62
- version: 4.46.7-rc2
changelogEntry:
- summary: Fixed Python SDK generation to use native Pydantic field aliases and improved core parsing so wire-key and nested/union validation works correctly across Pydantic v1/v2.
type: fix
createdAt: "2026-01-07"
irVersion: 62
- version: 4.46.7-rc1
changelogEntry:
- summary: Update Dockerfile to use the latest generator-cli with improve reference.md generation.
type: chore
createdAt: "2026-01-05"
irVersion: 62
- version: 4.46.7-rc0
changelogEntry:
- summary: Skip installation of generator-cli in Python SDK generator as it is already installed in the base image.
type: chore
createdAt: "2025-12-23"
irVersion: 62
- version: 4.46.6
changelogEntry:
- summary: |
Support custom `x-fern-sdk-method-name` on AsyncAPI operations.
type: fix
createdAt: "2025-12-19"
irVersion: 62
- version: 4.46.5
changelogEntry:
- summary: |
Update to support IR version 62.6.0 with new WebSocketMessage.methodName field,
webhook response descriptions, and OpenAPI explode parameter support.
type: chore
createdAt: "2025-12-18"
irVersion: 62
- version: 4.46.4-rc2
changelogEntry:
- summary: |
Add sdkVersion as a top-level field in the generated metadata.json file.
type: chore
createdAt: "2025-12-18"
irVersion: 61
- version: 4.46.4-rc1
changelogEntry:
- summary: |
Fix URL path stripping when base URL contains path prefixes.
type: fix
createdAt: "2025-12-16"
irVersion: 61
- version: 4.46.4-rc0
changelogEntry:
- summary: |
Fix wire test generation to use `config.client.exported_class_name` for the client class name
instead of deriving it from the organization and workspace names. This ensures wire tests
import and instantiate the correct client class when a custom exported class name is configured.
type: fix
createdAt: "2025-12-18"
irVersion: 61
- version: 4.46.3
changelogEntry:
- summary: |
Fix empty request body issue where endpoints with all-optional fields would send an empty
body instead of `{}`. When an endpoint has a request body type but all fields are optional,
the SDK now correctly sends `{}` as valid JSON rather than omitting the body entirely.
type: fix
createdAt: "2025-12-17"
irVersion: 61
- version: 4.46.2
changelogEntry:
- summary: |
Fix handling of newlines in default values for strings when using `config.pydantic_config.use_provided_defaults`.
type: fix
createdAt: "2025-12-16"
irVersion: 61
- version: 4.46.1
changelogEntry:
- summary: |
Fix OAuth token handling for optional expires_in field with default fallback.
type: fix
createdAt: "2025-12-16"
irVersion: 61
- version: 4.46.0
changelogEntry:
- summary: |
FastAPI Python codegen now emits parameter markers via `typing.Annotated[...]` with standard Python defaults for better FastAPI/Pydantic compatibility.
type: feat
createdAt: "2025-12-16"
irVersion: 61
- version: 4.45.10
changelogEntry:
- summary: |
Fix retry logic "off-by-two" error. The internal `retries` counter now starts at 0
instead of 2, and `max_retries` defaults to 2 when not specified. This ensures users
get the expected number of retries (2 by default, or the configured `max_retries` value).
type: fix
createdAt: "2025-12-15"
irVersion: 61
- version: 4.45.9
changelogEntry:
- summary: |
Fix empty query params stripping existing URL query strings. When `params` and
`additional_query_parameters` are both empty, httpx now receives `params=None` instead
of `params=[]`, preserving any query parameters already present in the URL (e.g.,
pagination cursors like `?after=123`).
type: fix
createdAt: "2025-12-12"
irVersion: 61
- version: 4.45.8
changelogEntry:
- summary: Ensures the root client always exposes a headers parameter and forwards it to the underlying ClientWrapper.
type: fix
createdAt: "2025-12-12"
irVersion: 61
- version: 4.45.7
changelogEntry:
- summary: Fix client wrapper instantiation to use the correct bearer token parameter name, preventing incorrect `token=` references when custom auth parameter names are configured.
type: fix
createdAt: "2025-12-12"
irVersion: 61
- version: 4.45.6
changelogEntry:
- summary: Fix failing wire tests under `pytest-xdist` by using a single shared WireMock plugin.
type: fix
createdAt: "2025-12-11"
irVersion: 61
- version: 4.45.5
changelogEntry:
- summary: |
Fix file upload conditional check using wire_value instead of snake_case parameter name,
which caused mypy "name not defined" errors when the API field name differed from the
Python parameter name (e.g., `MyFile` vs `my_file`).
type: fix
createdAt: "2025-12-11"
irVersion: 61
- version: 4.45.4
changelogEntry:
- summary: Fix offset pagination to handle None items when calculating next page offset.
type: fix
createdAt: "2025-12-11"
irVersion: 61
- version: 4.45.3
changelogEntry:
- summary: Add return types to reference.md method signatures for consistency with other SDK generators.
type: fix
createdAt: "2025-12-10"
irVersion: 61
- version: 4.45.2
changelogEntry:
- summary: Fix Python wire test generation by schema-based path/body name deconfliction and aligning client class resolution with the SDK's custom config rules.
type: fix
createdAt: "2025-12-10"