Skip to content

Commit 06c6be8

Browse files
committed
fix(split): serialize split_class in multipart requests
1 parent 7576d1f commit 06c6be8

3 files changed

Lines changed: 32 additions & 5 deletions

File tree

src/landingai_ade/_client.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from __future__ import annotations
44

55
import os
6+
import json
67
import importlib.metadata
78
from typing import TYPE_CHECKING, Any, Dict, Union, Mapping, Iterable, Optional, cast
89
from pathlib import Path
@@ -731,7 +732,7 @@ def section(
731732
def split(
732733
self,
733734
*,
734-
split_class: Iterable[client_split_params.SplitClass],
735+
split_class: Union[str, Iterable[client_split_params.SplitClass]],
735736
markdown: Union[FileTypes, str, None] | Omit = omit,
736737
markdown_url: Optional[str] | Omit = omit,
737738
model: Optional[str] | Omit = omit,
@@ -779,9 +780,10 @@ def split(
779780
# Store original inputs for filename extraction
780781
original_markdown = markdown
781782
original_markdown_url = markdown_url
783+
normalized_split_class = split_class if isinstance(split_class, str) else json.dumps(list(split_class))
782784
body = deepcopy_with_paths(
783785
{
784-
"split_class": split_class,
786+
"split_class": normalized_split_class,
785787
"markdown": markdown,
786788
"markdown_url": markdown_url,
787789
"model": model,
@@ -1422,7 +1424,7 @@ async def section(
14221424
async def split(
14231425
self,
14241426
*,
1425-
split_class: Iterable[client_split_params.SplitClass],
1427+
split_class: Union[str, Iterable[client_split_params.SplitClass]],
14261428
markdown: Union[FileTypes, str, None] | Omit = omit,
14271429
markdown_url: Optional[str] | Omit = omit,
14281430
model: Optional[str] | Omit = omit,
@@ -1470,9 +1472,10 @@ async def split(
14701472
# Store original inputs for filename extraction
14711473
original_markdown = markdown
14721474
original_markdown_url = markdown_url
1475+
normalized_split_class = split_class if isinstance(split_class, str) else json.dumps(list(split_class))
14731476
body = deepcopy_with_paths(
14741477
{
1475-
"split_class": split_class,
1478+
"split_class": normalized_split_class,
14761479
"markdown": markdown,
14771480
"markdown_url": markdown_url,
14781481
"model": model,

src/landingai_ade/types/client_split_params.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212

1313
class ClientSplitParams(TypedDict, total=False):
14-
split_class: Required[Iterable[SplitClass]]
14+
split_class: Required[Union[str, Iterable[SplitClass]]]
1515
"""List of split classification options/configuration.
1616
1717
Can be provided as JSON string in form data.

tests/test_client.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,30 @@ def test_multipart_repeating_array(self, client: LandingAIADE) -> None:
579579
b"",
580580
]
581581

582+
def test_split_sends_split_class_as_json_string_in_multipart(self, client: LandingAIADE) -> None:
583+
request = client._build_request(
584+
FinalRequestOptions.construct(
585+
method="post",
586+
url="/v1/ade/split",
587+
headers={"Content-Type": "multipart/form-data; boundary=6b7ba517decee4a450543ea6ae821c82"},
588+
json_data={"split_class": json.dumps([{"name": "Bank Statement"}]), "markdown": "# doc"},
589+
files=(),
590+
)
591+
)
592+
593+
assert request.read().split(b"\r\n") == [
594+
b"--6b7ba517decee4a450543ea6ae821c82",
595+
b'Content-Disposition: form-data; name="split_class"',
596+
b"",
597+
b'[{"name": "Bank Statement"}]',
598+
b"--6b7ba517decee4a450543ea6ae821c82",
599+
b'Content-Disposition: form-data; name="markdown"',
600+
b"",
601+
b"# doc",
602+
b"--6b7ba517decee4a450543ea6ae821c82--",
603+
b"",
604+
]
605+
582606
@pytest.mark.respx(base_url=base_url)
583607
def test_binary_content_upload(self, respx_mock: MockRouter, client: LandingAIADE) -> None:
584608
respx_mock.post("/upload").mock(side_effect=mirror_request_content)

0 commit comments

Comments
 (0)