Skip to content
Open
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
14 changes: 7 additions & 7 deletions openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -14069,7 +14069,7 @@ components:
properties:
file:
type: string
contentMediaType: application/octet-stream
format: binary
title: File
validation_result:
type: string
Expand Down Expand Up @@ -14102,7 +14102,7 @@ components:
file:
anyOf:
- type: string
contentMediaType: application/octet-stream
format: binary
- type: 'null'
title: File
copy_from_dataset_id:
Expand Down Expand Up @@ -14173,14 +14173,14 @@ components:
query_files:
items:
type: string
contentMediaType: application/octet-stream
format: binary
type: array
title: Query Files
default: []
response_files:
items:
type: string
contentMediaType: application/octet-stream
format: binary
type: array
title: Response Files
default: []
Expand All @@ -14192,7 +14192,7 @@ components:
properties:
file:
type: string
contentMediaType: application/octet-stream
format: binary
title: File
dataset_id:
type: string
Expand Down Expand Up @@ -14242,7 +14242,7 @@ components:
properties:
file:
type: string
contentMediaType: application/octet-stream
format: binary
title: File
log_stream_id:
anyOf:
Expand Down Expand Up @@ -14301,7 +14301,7 @@ components:
properties:
file:
type: string
contentMediaType: application/octet-stream
format: binary
title: File
test_input:
anyOf:
Expand Down
37 changes: 31 additions & 6 deletions scripts/import-openapi-yaml.sh
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ curl -s "${HOST_URL}/openapi.json" | poetry run python -c 'import sys, json, yam
# - ListDatasetParams.properties.sort.default = "None"
# - ListPromptTemplateParams.properties.sort.default = "None"
# - ProjectCollectionParams.properties.sort.default = "None"
# - ListAnnotationQueueParams.properties.sort.default = "None"
# - galileo_core__schemas__shared__scorers__scorer_name__ScorerName.title = "CoreScorerName"
# - galileo_core__schemas__shared__scorers__scorer_name__ScorerName.enum |= unique
# - /llm_integrations/projects/{project_id}/runs/{run_id}.get.responses[200].schema.title = "GetRunIntegrationsResponse" (Windows filename length fix)
Expand All @@ -43,16 +44,40 @@ curl -s "${HOST_URL}/openapi.json" | poetry run python -c 'import sys, json, yam
# - NotNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____.title = "NotNodeLogRecordsFilter"
# - OrNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____.title = "OrNodeLogRecordsFilter"
# - StepType.enum += ["control"] |= unique: server omits this value from the spec but returns it for some log-stream columns (sc-62628); unique deduplicates if the server spec is later fixed
# - multipart/form-data binary fields: contentMediaType = "application/octet-stream" -> format = "binary"
#
# If you run into related issues with the auto-generate-api-client.sh script, add the openapi.yaml patches here.

# Apply all patches using yq in a single command
poetry run python -m yq --in-place -Y '.components.schemas.api__schemas__project_v2__GetProjectsPaginatedResponse.title = "GetProjectsPaginatedResponseV2" | .components.schemas.galileo_core__schemas__shared__message__Message.title = "MessagesListItem" | .components.schemas.galileo_core__schemas__shared__message_role__MessageRole.title = "MessagesListItemRole" | .components.schemas.ListDatasetParams.properties.sort.default = "None" | .components.schemas.ListPromptTemplateParams.properties.sort.default = "None" | .components.schemas.ProjectCollectionParams.properties.sort.default = "None" | .components.schemas.galileo_core__schemas__shared__scorers__scorer_name__ScorerName.title = "CoreScorerName" | .components.schemas.galileo_core__schemas__shared__scorers__scorer_name__ScorerName.enum |= unique | .paths["/llm_integrations/projects/{project_id}/runs/{run_id}"].get.responses["200"].content["application/json"].schema.title = "GetRunIntegrationsResponse" | .components.schemas.Document.properties.content = .components.schemas.Document.properties.page_content | del(.components.schemas.Document.properties.page_content) | .components.schemas.Document.properties.content.title = "Content" | .components.schemas.Document.required = ["content"] | .components.schemas["AndNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "AndNodeLogRecordsFilter" | .components.schemas["FilterExpression_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "FilterExpressionLogRecordsFilter" | .components.schemas["FilterLeaf_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "FilterLeafLogRecordsFilter" | .components.schemas["NotNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "NotNodeLogRecordsFilter" | .components.schemas["OrNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "OrNodeLogRecordsFilter" | .components.schemas.StepType.enum += ["control"] | .components.schemas.StepType.enum |= unique' "$HOME_DIR/openapi.yaml"
poetry run python -m yq --in-place -Y '.components.schemas.api__schemas__project_v2__GetProjectsPaginatedResponse.title = "GetProjectsPaginatedResponseV2" | .components.schemas.galileo_core__schemas__shared__message__Message.title = "MessagesListItem" | .components.schemas.galileo_core__schemas__shared__message_role__MessageRole.title = "MessagesListItemRole" | .components.schemas.ListDatasetParams.properties.sort.default = "None" | .components.schemas.ListPromptTemplateParams.properties.sort.default = "None" | .components.schemas.ProjectCollectionParams.properties.sort.default = "None" | .components.schemas.ListAnnotationQueueParams.properties.sort.default = "None" | .components.schemas.galileo_core__schemas__shared__scorers__scorer_name__ScorerName.title = "CoreScorerName" | .components.schemas.galileo_core__schemas__shared__scorers__scorer_name__ScorerName.enum |= unique | .paths["/llm_integrations/projects/{project_id}/runs/{run_id}"].get.responses["200"].content["application/json"].schema.title = "GetRunIntegrationsResponse" | .components.schemas.Document.properties.content = .components.schemas.Document.properties.page_content | del(.components.schemas.Document.properties.page_content) | .components.schemas.Document.properties.content.title = "Content" | .components.schemas.Document.required = ["content"] | .components.schemas["AndNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "AndNodeLogRecordsFilter" | .components.schemas["FilterExpression_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "FilterExpressionLogRecordsFilter" | .components.schemas["FilterLeaf_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "FilterLeafLogRecordsFilter" | .components.schemas["NotNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "NotNodeLogRecordsFilter" | .components.schemas["OrNode_Annotated_Union_LogRecordsIDFilter__LogRecordsDateFilter__LogRecordsNumberFilter__LogRecordsBooleanFilter__LogRecordsCollectionFilter__LogRecordsTextFilter__LogRecordsFullyAnnotatedFilter___FieldInfo_annotation_NoneType__required_True__discriminator__type____"].title = "OrNodeLogRecordsFilter" | .components.schemas.StepType.enum += ["control"] | .components.schemas.StepType.enum |= unique | .components.schemas["Body_create_code_scorer_version_scorers__scorer_id__version_code_post"].properties.file.format = "binary" | del(.components.schemas["Body_create_code_scorer_version_scorers__scorer_id__version_code_post"].properties.file.contentMediaType) | .components.schemas["Body_create_dataset_datasets_post"].properties.file.anyOf[0].format = "binary" | del(.components.schemas["Body_create_dataset_datasets_post"].properties.file.anyOf[0].contentMediaType) | .components.schemas["Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post"].properties.query_files.items.format = "binary" | del(.components.schemas["Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post"].properties.query_files.items.contentMediaType) | .components.schemas["Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post"].properties.response_files.items.format = "binary" | del(.components.schemas["Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post"].properties.response_files.items.contentMediaType) | .components.schemas["Body_validate_code_scorer_dataset_scorers_code_validate_dataset_post"].properties.file.format = "binary" | del(.components.schemas["Body_validate_code_scorer_dataset_scorers_code_validate_dataset_post"].properties.file.contentMediaType) | .components.schemas["Body_validate_code_scorer_log_record_scorers_code_validate_log_record_post"].properties.file.format = "binary" | del(.components.schemas["Body_validate_code_scorer_log_record_scorers_code_validate_log_record_post"].properties.file.contentMediaType) | .components.schemas["Body_validate_code_scorer_scorers_code_validate_post"].properties.file.format = "binary" | del(.components.schemas["Body_validate_code_scorer_scorers_code_validate_post"].properties.file.contentMediaType)' "$HOME_DIR/openapi.yaml"

# Check if the command was successful
if [ $? -eq 0 ]; then
echo "OpenAPI YAML saved to $HOME_DIR/openapi.yaml"
else
echo "Failed to fetch and convert OpenAPI JSON"
if [ $? -ne 0 ]; then
echo "Failed to patch OpenAPI YAML"
exit 1
fi

poetry run python -m yq -e '
[
.components.schemas.Body_create_code_scorer_version_scorers__scorer_id__version_code_post.properties.file.format == "binary",
(.components.schemas.Body_create_code_scorer_version_scorers__scorer_id__version_code_post.properties.file | has("contentMediaType") | not),
.components.schemas.Body_create_dataset_datasets_post.properties.file.anyOf[0].format == "binary",
(.components.schemas.Body_create_dataset_datasets_post.properties.file.anyOf[0] | has("contentMediaType") | not),
.components.schemas.Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post.properties.query_files.items.format == "binary",
(.components.schemas.Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post.properties.query_files.items | has("contentMediaType") | not),
.components.schemas.Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post.properties.response_files.items.format == "binary",
(.components.schemas.Body_manual_llm_validate_multipart_scorers_llm_validate_multipart_post.properties.response_files.items | has("contentMediaType") | not),
.components.schemas.Body_validate_code_scorer_dataset_scorers_code_validate_dataset_post.properties.file.format == "binary",
(.components.schemas.Body_validate_code_scorer_dataset_scorers_code_validate_dataset_post.properties.file | has("contentMediaType") | not),
.components.schemas.Body_validate_code_scorer_log_record_scorers_code_validate_log_record_post.properties.file.format == "binary",
(.components.schemas.Body_validate_code_scorer_log_record_scorers_code_validate_log_record_post.properties.file | has("contentMediaType") | not),
.components.schemas.Body_validate_code_scorer_scorers_code_validate_post.properties.file.format == "binary",
(.components.schemas.Body_validate_code_scorer_scorers_code_validate_post.properties.file | has("contentMediaType") | not)
] | all
' "$HOME_DIR/openapi.yaml" > /dev/null

if [ $? -ne 0 ]; then
echo "Failed to patch multipart binary fields in OpenAPI YAML"
exit 1
fi

echo "OpenAPI YAML saved to $HOME_DIR/openapi.yaml"
Original file line number Diff line number Diff line change
@@ -1,30 +1,33 @@
from __future__ import annotations

from collections.abc import Mapping
from io import BytesIO
from typing import Any, TypeVar

from attrs import define as _attrs_define
from attrs import field as _attrs_field

from .. import types
from ..types import File

T = TypeVar("T", bound="BodyCreateCodeScorerVersionScorersScorerIdVersionCodePost")


@_attrs_define
class BodyCreateCodeScorerVersionScorersScorerIdVersionCodePost:
"""
Attributes:
Attributes
----------
file (str):
validation_result (str): Pre-validated result as JSON string from the validate endpoint
validation_result (str): Pre-validated result as JSON string from the validate endpoint.
"""

file: str
file: File
validation_result: str
additional_properties: dict[str, Any] = _attrs_field(init=False, factory=dict)

def to_dict(self) -> dict[str, Any]:
file = self.file
file = self.file.to_tuple()

validation_result = self.validation_result

Expand All @@ -37,7 +40,7 @@ def to_dict(self) -> dict[str, Any]:
def to_multipart(self) -> types.RequestFiles:
files: types.RequestFiles = []

files.append(("file", (None, str(self.file).encode(), "text/plain")))
files.append(("file", self.file.to_tuple()))

files.append(("validation_result", (None, str(self.validation_result).encode(), "text/plain")))

Expand All @@ -49,7 +52,7 @@ def to_multipart(self) -> types.RequestFiles:
@classmethod
def from_dict(cls: type[T], src_dict: Mapping[str, Any]) -> T:
d = dict(src_dict)
file = d.pop("file")
file = File(payload=BytesIO(d.pop("file")))

validation_result = d.pop("validation_result")

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
from __future__ import annotations

from collections.abc import Mapping
from io import BytesIO
from typing import Any, TypeVar, cast

from attrs import define as _attrs_define
from attrs import field as _attrs_field

from .. import types
from ..types import UNSET, Unset
from ..types import UNSET, File, FileTypes, Unset

T = TypeVar("T", bound="BodyCreateDatasetDatasetsPost")

Expand All @@ -20,7 +21,7 @@ class BodyCreateDatasetDatasetsPost:
hidden (bool | Unset): Default: False.
name (None | str | Unset):
append_suffix_if_duplicate (bool | Unset): Default: False.
file (None | str | Unset):
file (File | None | Unset):
copy_from_dataset_id (None | str | Unset):
copy_from_dataset_version_index (int | None | Unset):
project_id (None | str | Unset):
Expand All @@ -31,7 +32,7 @@ class BodyCreateDatasetDatasetsPost:
hidden: bool | Unset = False
name: None | str | Unset = UNSET
append_suffix_if_duplicate: bool | Unset = False
file: None | str | Unset = UNSET
file: File | None | Unset = UNSET
copy_from_dataset_id: None | str | Unset = UNSET
copy_from_dataset_version_index: int | None | Unset = UNSET
project_id: None | str | Unset = UNSET
Expand All @@ -51,9 +52,11 @@ def to_dict(self) -> dict[str, Any]:

append_suffix_if_duplicate = self.append_suffix_if_duplicate

file: None | str | Unset
file: FileTypes | None | Unset
if isinstance(self.file, Unset):
file = UNSET
elif isinstance(self.file, File):
file = self.file.to_tuple()
else:
file = self.file

Expand Down Expand Up @@ -126,8 +129,8 @@ def to_multipart(self) -> types.RequestFiles:
)

if not isinstance(self.file, Unset):
if isinstance(self.file, str):
files.append(("file", (None, str(self.file).encode(), "text/plain")))
if isinstance(self.file, File):
files.append(("file", self.file.to_tuple()))
else:
files.append(("file", (None, str(self.file).encode(), "text/plain")))

Expand Down Expand Up @@ -188,12 +191,18 @@ def _parse_name(data: object) -> None | str | Unset:

append_suffix_if_duplicate = d.pop("append_suffix_if_duplicate", UNSET)

def _parse_file(data: object) -> None | str | Unset:
def _parse_file(data: object) -> File | None | Unset:
if data is None:
return data
if isinstance(data, Unset):
return data
return cast(None | str | Unset, data)
try:
if not isinstance(data, bytes):
raise TypeError()
return File(payload=BytesIO(data))
except: # noqa: E722
pass
return cast(File | None | Unset, data)

file = _parse_file(d.pop("file", UNSET))

Expand Down
Loading
Loading