Repository navigation
feat(api): update API spec from langfuse/langfuse 9a75785 #2120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,28 @@ | ||
| # This file was auto-generated by Fern from our API Definition. | ||
|
|
||
| import typing | ||
|
|
||
| from ...core import enum | ||
|
|
||
| T_Result = typing.TypeVar("T_Result") | ||
|
|
||
|
|
||
| class BlobStorageIntegrationAuthType(enum.StrEnum): | ||
| """ | ||
| How Langfuse authenticates to the bucket. | ||
| - `ACCESS_KEYS`: stored access key ID and secret access key. | ||
| - `ROLE_ARN`: Langfuse assumes an IAM role in your AWS account (Amazon S3 only). Langfuse's cross-account role (`crossAccountRoleArn`) assumes your role with the integration's `externalId`, using a session limited to writing under the configured prefix. Requires an Enterprise plan and a deployment that configures a cross-account role; `crossAccountRoleArn` is not null when both apply. | ||
| """ | ||
|
|
||
| ACCESS_KEYS = "ACCESS_KEYS" | ||
| ROLE_ARN = "ROLE_ARN" | ||
|
|
||
| def visit( | ||
| self, | ||
| access_keys: typing.Callable[[], T_Result], | ||
| role_arn: typing.Callable[[], T_Result], | ||
| ) -> T_Result: | ||
| if self is BlobStorageIntegrationAuthType.ACCESS_KEYS: | ||
| return access_keys() | ||
| if self is BlobStorageIntegrationAuthType.ROLE_ARN: | ||
| return role_arn() |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,6 +11,7 @@ | |
| from .blob_storage_export_frequency import BlobStorageExportFrequency | ||
| from .blob_storage_export_mode import BlobStorageExportMode | ||
| from .blob_storage_export_source import BlobStorageExportSource | ||
| from .blob_storage_integration_auth_type import BlobStorageIntegrationAuthType | ||
| from .blob_storage_integration_file_type_response import ( | ||
| BlobStorageIntegrationFileTypeResponse, | ||
| ) | ||
|
|
@@ -24,9 +25,33 @@ class BlobStorageIntegrationResponse(UniversalBaseModel): | |
| bucket_name: typing_extensions.Annotated[str, FieldMetadata(alias="bucketName")] | ||
| endpoint: typing.Optional[str] = None | ||
| region: str | ||
| auth_type: typing_extensions.Annotated[ | ||
| BlobStorageIntegrationAuthType, FieldMetadata(alias="authType") | ||
| ] | ||
|
Comment on lines
+28
to
+30
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If a self-hosted server predates Give the new response field a backward-compatible default so upgrading the SDK does not require upgrading the server. Prompt To Fix With AIThis is a comment left during a code review.
Path: langfuse/api/blob_storage_integrations/types/blob_storage_integration_response.py
Line: 28-30
Comment:
**Older server responses fail**
If a self-hosted server predates `authType`, the newly required `auth_type` field makes `parse_obj_as` raise `ValidationError` on its response. Listing integrations fails, and an upsert can save successfully before the client raises an error—even when callers use only access keys.
Give the new response field a backward-compatible default so upgrading the SDK does not require upgrading the server.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly. |
||
| access_key_id: typing_extensions.Annotated[ | ||
| typing.Optional[str], FieldMetadata(alias="accessKeyId") | ||
| ] = None | ||
| role_arn: typing_extensions.Annotated[ | ||
| typing.Optional[str], FieldMetadata(alias="roleArn") | ||
| ] = pydantic.Field(default=None) | ||
| """ | ||
| IAM role Langfuse assumes. May be set while `authType` is `ACCESS_KEYS` if the integration used `ROLE_ARN` before. | ||
| """ | ||
|
|
||
| external_id: typing_extensions.Annotated[ | ||
| typing.Optional[str], FieldMetadata(alias="externalId") | ||
| ] = pydantic.Field(default=None) | ||
| """ | ||
| External ID Langfuse passes when assuming `roleArn`. Require it in the role's trust policy with an `sts:ExternalId` condition. Null until the integration first uses `ROLE_ARN`. | ||
| """ | ||
|
|
||
| cross_account_role_arn: typing_extensions.Annotated[ | ||
| typing.Optional[str], FieldMetadata(alias="crossAccountRoleArn") | ||
| ] = pydantic.Field(default=None) | ||
| """ | ||
| Langfuse role that must be trusted by `roleArn`. Null when the deployment does not support IAM role auth or the organization is not on an Enterprise plan. | ||
| """ | ||
|
|
||
| prefix: str | ||
| export_frequency: typing_extensions.Annotated[ | ||
| BlobStorageExportFrequency, FieldMetadata(alias="exportFrequency") | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔴 Callers on a self-hosted Langfuse server older than the authType release would get a ValidationError from every blob storage get, list or upsert, where the base parsed fine. New response fields are declared required with no default. Fix: give every newly added response field a default (
= Noneforauth_type, an empty list forrule_ids), which covers the 2 sites listed. Same pattern at 2 sites (blob_storage_integration_response.py:28, unstable/topics/types/topic_facet.py:22).Why this was flagged
This only matters if a caller upgrades the SDK while pointing at a Langfuse server that does not yet send
authTypeorruleIds, such as a self-hosted deployment that predates langfuse/langfuse 9a75785.BlobStorageIntegrationResponse.auth_type(blob_storage_integration_response.py:28-30) is annotatedBlobStorageIntegrationAuthTypewith no default, so it is required. The raw client decodes 2xx bodies withparse_obj_as(core/pydantic_utilities.py:53-60), which callsTypeAdapter.validate_python. A body withoutauthTypetherefore raises a pydantic ValidationError instead of returning data. On the base branch the same responses parse, because the field did not exist.TopicFacet.rule_ids(topic_facet.py:22-24) is also required viapydantic.Field(), so list_facets/get_facet fail the same way against servers withoutruleIds. Nothing else guards against the missing key.Verification:
blob_storage_integration_response.pyaddsauth_typewith no= ...default, so the field is required.topic_facet.pyaddsrule_ids: ... = pydantic.Field(), which is also required. In the base file this field does not exist, so the base parsed these responses fine.parse_obj_as(core/pydantic_utilities.py:53-60) raises a pydantic ValidationError when a required field is missing.