Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions fern/products/openapi-def/openapi-def.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ navigation:
- page: Authentication
path: ./pages/auth.mdx
- page: Servers
path: ./pages/servers.mdx
path: ./pages/servers.mdx
- section: Endpoints
slug: endpoints
contents:
Expand All @@ -17,6 +17,9 @@ navigation:
- page: Server-Sent Events
path: ./pages/endpoints/sse.mdx
slug: sse
- page: others
title: Other
path: pages/extensions/others.mdx
- section: Extensions
slug: extensions
contents:
Expand All @@ -38,7 +41,7 @@ navigation:
- page: Overlay Customizations
path: ./pages/overrides.mdx
- page: Sync your OpenAPI Specification
path: ./pages/automation.mdx
path: ./pages/automation.mdx
- section: Integrate your Server Framework
slug: frameworks
contents:
Expand Down
64 changes: 53 additions & 11 deletions fern/products/openapi-def/pages/extensions/parameter-names.mdx
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
---
title: Customize parameter names
description: Use `x-fern-parameter-name` to customize query parameter, header and path parameter naming.
description: Use extensions like x-fern-parameter-name and x-fern-sdk-variables to customize parameter naming and inject variables into generated SDKs.
---

<Note>
The `x-fern-parameter-name` extension allows you to customize the variable names of parameters in your generated SDKs.
The `x-fern-parameter-name` and `x-fern-sdk-variables` extensions allow you to customize how parameters are named and injected in your generated SDKs.
</Note>

## Headers
## Parameter Renaming with x-fern-parameter-name

In the example below, the header `X-API-Version` is renamed to `version` in the
generated SDK. The rename makes the SDK more human readable.
Use `x-fern-parameter-name` to rename parameters in your generated SDK for improved readability and usability.

### Headers

In the example below, the header `X-API-Version` is renamed to `version` in the generated SDK for better readability:

```yaml {8}
paths:
Expand All @@ -26,10 +29,9 @@ paths:
required: true
```

## Query parameters
### Query parameters

In the example below, the query parameter `q` is renamed to `search_terms` in the
generated SDK. The rename makes the parameter more approachable for end users.
Here, the query parameter `q` is renamed to `search_terms` for clearer intent:

```yaml {8}
paths:
Expand All @@ -45,10 +47,9 @@ paths:
required: false
```

## Path parameters
### Path parameters

In the example below, the path parameter `userId` is renamed to `id` in the
generated SDK. The rename makes the SDK less verbose.
The path parameter `userId` is simplified to `id` to reduce verbosity:

```yaml {8}
paths:
Expand All @@ -63,3 +64,44 @@ paths:
type: string
required: false
```

## SDK Variables with x-fern-sdk-variables

Use `x-fern-sdk-variables` to define variables that will be injected into your SDK paths. This is especially useful for common path parameters that you want to set once during SDK initialization.

```yaml
components:
# Other components...
x-fern-sdk-variables:
project_id:
type: string
description: "The ID of the project"
pattern: "^proj_[a-zA-Z0-9]+$"
```

Then reference this variable in your paths:

```yaml
paths:
"/v1/connect/{project_id}/accounts":
parameters:
- name: project_id
in: path
required: true
description: "The project ID"
schema:
type: string
pattern: "^proj_[a-zA-Z0-9]+$"
x-fern-sdk-variable: project_id
```

When using the generated SDK, instead of passing the project_id parameter for each API call, you can set it once during client initialization:

```python
# Python example
client = YourSDK(project_id="proj_123")
```

<Note>
The x-fern-sdk-variables feature requires Fern generator version 4.24.0 or higher.
</Note>
83 changes: 83 additions & 0 deletions fern/products/openapi-definition/pages/extensions/others.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
---
title: "Other Extensions"
description: "Details on other common OpenAPI extensions used with Fern"
---

Fern supports several OpenAPI extensions that provide additional functionality when generating SDKs and documentation. Here is a comprehensive list of extension headers:

## x-fern-sdk-variables

Allows you to define variables that can be passed to the generated SDK client constructor. These variables will be automatically injected into API paths.

```yaml
components:
x-fern-sdk-variables:
project_id:
type: string
description: "The project ID for the API"
pattern: "^proj_[a-zA-Z0-9]+$"
```

## x-fern-sdk-group-name

Groups related endpoints together in the generated SDK under a single namespace/class.

```yaml
paths:
/users:
get:
x-fern-sdk-group-name: "users"
```

## x-fern-sdk-method-name

Specifies a custom method name to use in the generated SDK instead of the default operation ID.

```yaml
paths:
/users:
get:
x-fern-sdk-method-name: "list"
```

## x-fern-pagination

Configures pagination handling for list endpoints.

```yaml
paths:
/users:
get:
x-fern-pagination:
cursor: "$request.after"
next_cursor: "$response.page_info.end_cursor"
results: "$response.data"
```

## x-fern-sdk-return-value

Specifies which part of the response should be returned by the SDK method.

```yaml
paths:
/users/{id}:
get:
x-fern-sdk-return-value: "data"
```

## x-fern-ignore

Excludes an endpoint or schema from SDK generation.

```yaml
paths:
/internal/metrics:
get:
x-fern-ignore: true
```

These extensions help customize how Fern generates SDKs from your OpenAPI specification while maintaining standard OpenAPI compatibility.

<Note>
When using these extensions, make sure to validate that your OpenAPI specification remains valid according to the OpenAPI specification.
</Note>
25 changes: 16 additions & 9 deletions fern/products/sdks/overview/python/configuration.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ groups:
## SDK Configuration Options

<ParamField path="additional_init_exports" type="array" default="null" required={false} toc={true}>
A list of additional exports to include in the package's __init__.py file.
</ParamField>

<ParamField path="default_bytes_stream_chunk_size" type="number" default="null" required={false} toc={true}>
The chunk size to use (if any) when processing a response bytes stream within `iter_bytes` or `aiter_bytes` results in: `for chunk in response.iter_bytes(chunk_size=<default_bytes_stream_chunk_size>):`
</ParamField>

<ParamField path="exclude_types_from_init_exports" type="bool" default="false" required={false} toc={true}>
When true, types will not be exported in the package's __init__.py file.
</ParamField>

<ParamField path="extra_dependencies" type="object" default="{}" required={false} toc={true}>
Expand All @@ -40,44 +42,45 @@ groups:
</ParamField>

<ParamField path="extra_dev_dependencies" type="object" default="{}" required={false} toc={true}>
Additional development dependencies to include in the generated SDK.
</ParamField>

<ParamField path="extras" type="object" default="{}" required={false} toc={true}>
Optional dependencies that can be installed with the package.
</ParamField>

<ParamField path="flat_layout" type="bool" default="false" required={false} toc={true}>
When true, generates a flatter file structure without nested directories.
</ParamField>

<ParamField path="follow_redirects_by_default" type="bool" default="true" required={false} toc={true}>
Whether to follow redirects by default in HTTP requests.
</ParamField>

<ParamField path="improved_imports" type="bool" default="true" required={false} toc={true}>
Feature flag that improves imports in the Python SDK by removing nested `resources` directory
Feature flag that improves imports in the Python SDK by removing nested `resources` directory.
</ParamField>

<ParamField path="include_legacy_wire_tests" type="bool" default="false" required={false} toc={true}>
Whether or not to include legacy wire tests in the generated SDK
Whether or not to include legacy wire tests in the generated SDK.
</ParamField>

<ParamField path="include_union_utils" type="bool" default="false" required={false} toc={true}>
When true, generates utility functions for union types.
</ParamField>

<ParamField path="inline_path_params" type="bool" default="false" required={false} toc={true}>
If true, treats path parameters as named parameters in endpoint functions.
If true, treats path parameters as named parameters in endpoint functions. This allows for automatic parameter injection like project_id when using x-fern-sdk-variables in your OpenAPI spec.
</ParamField>

<ParamField path="inline_request_params" type="bool" default="true" required={false} toc={true}>
Feature flag that removes the usage of request objects, and instead uses parameters in function signatures where possible.
</ParamField>

<ParamField path="package_name" type="string" default="null" required={false} toc={true}>

Specifies the Python package name that users will import your generated client
from.
Specifies the Python package name that users will import your generated client from.

For example, setting `package_name: "my_custom_package"` enables users to use
`my_custom_package import Client` to import your client:
For example, setting `package_name: "my_custom_package"` enables users to use `from my_custom_package import Client` to import your client:

```yaml {7-10}
default-group: local
Expand All @@ -92,6 +95,7 @@ groups:
</ParamField>

<ParamField path="pydantic_config" type="SdkPydanticModelCustomConfig" default="SdkPydanticModelCustomConfig()" required={false} toc={true}>
Configuration options for Pydantic model generation.
</ParamField>

<ParamField path="pydantic_config.include_union_utils" type="bool" default="false" required={false} toc={true}>
Expand Down Expand Up @@ -123,7 +127,7 @@ groups:
<ParamField path="pydantic_config.version" type="'v1' | 'v2' | 'both' | 'v1_on_v2'" default="both" required={false} toc={true}>
By default, the generator generates pydantic models that are v1 and v2 compatible. However you can override them to:
- `v1`: strictly use Pydantic v1
- `v2`: strictly use Pydantic v2
- `v2`: strictly use Pydantic v2
- `both`: maintain compatibility with both versions
- `v1_on_v2`: use Pydantic v1 compatibility layer on v2

Expand All @@ -140,20 +144,23 @@ groups:
</ParamField>

<ParamField path="pyproject_toml" type="string" default="null" required={false} toc={true}>
Custom pyproject.toml content to include in the generated package.
</ParamField>

<ParamField path="should_generate_websocket_clients" type="bool" default="false" required={false} toc={true}>
Feature flag that enables generation of Python websocket clients.
</ParamField>

<ParamField path="skip_formatting" type="bool" default="false" required={false} toc={true}>
When true, skips code formatting of the generated SDK.
</ParamField>

<ParamField path="timeout_in_seconds" type="number | 'infinity'" default="60" required={false} toc={true}>
By default, the generator generates a client that times out after 60 seconds. You can customize this value by providing a different number or setting to `infinity` to get rid of timeouts.
</ParamField>

<ParamField path="use_api_name_in_package" type="bool" default="false" required={false} toc={true}>
When true, includes the API name in the generated package name.
</ParamField>

<ParamField path="use_inheritance_for_extended_models" type="bool" default="true" required={false} toc={true}>
Expand Down
Loading
Loading