diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock index 7533edfe..457d3272 100755 --- a/.speakeasy/gen.lock +++ b/.speakeasy/gen.lock @@ -1,12 +1,12 @@ lockVersion: 2.0.0 id: 8b5fa338-9106-4734-abf0-e30d67044a90 management: - docChecksum: bac3524113e4b9ed02bfae0e65ccb42b + docChecksum: 940cbfd3d076c56d2c04a8413abb0e1d docVersion: 1.1.25 - speakeasyVersion: 1.552.0 - generationVersion: 2.610.0 - releaseVersion: 0.37.1 - configChecksum: 995e2ded80d15617a1661ac4be288219 + speakeasyVersion: 1.568.0 + generationVersion: 2.632.2 + releaseVersion: 0.37.2 + configChecksum: c18311f5449d4c3ab52058b6c2ab8715 repoURL: https://github.com/Unstructured-IO/unstructured-python-client.git repoSubDirectory: . installationURL: https://github.com/Unstructured-IO/unstructured-python-client.git @@ -16,7 +16,7 @@ features: acceptHeaders: 3.0.0 additionalDependencies: 1.0.0 constsAndDefaults: 1.0.5 - core: 5.19.0 + core: 5.19.3 defaultEnabledRetries: 0.2.0 enumUnions: 0.1.0 envVarSecurityUsage: 0.3.2 @@ -32,7 +32,7 @@ features: openEnums: 1.0.1 responseFormat: 1.0.1 retries: 3.0.2 - sdkHooks: 1.0.1 + sdkHooks: 1.1.0 serverIDs: 3.0.0 unions: 3.0.4 uploadStreams: 1.0.0 diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock index ab2a5441..c9bf4c10 100644 --- a/.speakeasy/workflow.lock +++ b/.speakeasy/workflow.lock @@ -2,20 +2,20 @@ speakeasyVersion: 1.552.0 sources: my-source: sourceNamespace: my-source - sourceRevisionDigest: sha256:d14d57547ad78fb9de555d53df7316688897fcfde70597ebae236e093686ac64 + sourceRevisionDigest: sha256:71b0c415bf2f060aae163e8321db207f2c3a5661e9fc4687f442ff1d7bf63a31 sourceBlobDigest: sha256:344e0d1a73221fe624794cb7c74290201da4093a73b6897fcbadea1d1cc99447 tags: - latest - - speakeasy-sdk-regen-1749082267 + - speakeasy-sdk-regen-1750778809 - 1.1.25 targets: unstructured-python: source: my-source sourceNamespace: my-source - sourceRevisionDigest: sha256:d14d57547ad78fb9de555d53df7316688897fcfde70597ebae236e093686ac64 + sourceRevisionDigest: sha256:71b0c415bf2f060aae163e8321db207f2c3a5661e9fc4687f442ff1d7bf63a31 sourceBlobDigest: sha256:344e0d1a73221fe624794cb7c74290201da4093a73b6897fcbadea1d1cc99447 codeSamplesNamespace: my-source-code-samples - codeSamplesRevisionDigest: sha256:0d9d8872a992b8f4dc480ccfd3fe65d9966f22cfbc3e69668ab15922d75a6c4c + codeSamplesRevisionDigest: sha256:a50f51859ef75df1e6875cbaf24765f1fdad97a569e90b04084015fc6a98029c workflow: workflowVersion: 1.0.0 speakeasyVersion: latest diff --git a/README.md b/README.md index b7ee2fe0..efadcc94 100755 --- a/README.md +++ b/README.md @@ -410,30 +410,18 @@ Certain SDK methods accept file objects as part of a request body or multi-part ```python from unstructured_client import UnstructuredClient -from unstructured_client.models import shared with UnstructuredClient() as uc_client: - res = uc_client.general.partition(request={ - "partition_parameters": { - "files": { - "content": open("example.file", "rb"), - "file_name": "example.file", - }, - "split_pdf_page_range": [ - 1, - 10, - ], - "vlm_model": shared.VLMModel.GPT_4O, - "vlm_model_provider": shared.VLMModelProvider.OPENAI, - }, + res = uc_client.workflows.run_workflow(request={ + "workflow_id": "e7054f23-ce92-4bf1-a1d7-7cf9cb14d013", }) - assert res.elements is not None + assert res.job_information is not None # Handle response - print(res.elements) + print(res.job_information) ``` diff --git a/RELEASES.md b/RELEASES.md index 0622c52a..c7a2affe 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1017,4 +1017,14 @@ Based on: ### Generated - [python v0.37.1] . ### Releases -- [PyPI v0.37.1] https://pypi.org/project/unstructured-client/0.37.1 - . \ No newline at end of file +- [PyPI v0.37.1] https://pypi.org/project/unstructured-client/0.37.1 - . + +## 2025-06-24 15:26:33 +### Changes +Based on: +- OpenAPI Doc +- Speakeasy CLI 1.552.0 (2.610.0) https://github.com/speakeasy-api/speakeasy +### Generated +- [python v0.37.2] . +### Releases +- [PyPI v0.37.2] https://pypi.org/project/unstructured-client/0.37.2 - . diff --git a/docs/sdks/general/README.md b/docs/sdks/general/README.md index 189a833f..306ba79a 100644 --- a/docs/sdks/general/README.md +++ b/docs/sdks/general/README.md @@ -22,14 +22,17 @@ with UnstructuredClient() as uc_client: res = uc_client.general.partition(request={ "partition_parameters": { + "chunking_strategy": "by_title", "files": { "content": open("example.file", "rb"), "file_name": "example.file", }, + "split_pdf_cache_tmp_data_dir": "", "split_pdf_page_range": [ 1, 10, ], + "strategy": shared.Strategy.AUTO, "vlm_model": shared.VLMModel.GPT_4O, "vlm_model_provider": shared.VLMModelProvider.OPENAI, }, diff --git a/gen.yaml b/gen.yaml index b8358b1e..a0125f9a 100644 --- a/gen.yaml +++ b/gen.yaml @@ -14,7 +14,7 @@ generation: oAuth2ClientCredentialsEnabled: false oAuth2PasswordEnabled: false python: - version: 0.37.1 + version: 0.37.2 additionalDependencies: dev: deepdiff: '>=6.0' diff --git a/pyproject.toml b/pyproject.toml index 55d2172f..4a45b136 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "unstructured-client" -version = "0.37.1" +version = "0.37.2" description = "Python Client SDK for Unstructured API" authors = [{ name = "Unstructured" },] readme = "README-PYPI.md" @@ -52,6 +52,8 @@ pythonpath = ["src"] [tool.mypy] disable_error_code = "misc" +explicit_package_bases = true +mypy_path = "src" [[tool.mypy.overrides]] module = "typing_inspect" diff --git a/src/unstructured_client/_version.py b/src/unstructured_client/_version.py index caacf37c..b787dac1 100644 --- a/src/unstructured_client/_version.py +++ b/src/unstructured_client/_version.py @@ -3,10 +3,10 @@ import importlib.metadata __title__: str = "unstructured-client" -__version__: str = "0.37.1" +__version__: str = "0.37.2" __openapi_doc_version__: str = "1.1.25" -__gen_version__: str = "2.610.0" -__user_agent__: str = "speakeasy-sdk/python 0.37.1 2.610.0 1.1.25 unstructured-client" +__gen_version__: str = "2.632.2" +__user_agent__: str = "speakeasy-sdk/python 0.37.2 2.632.2 1.1.25 unstructured-client" try: if __package__ is not None: diff --git a/src/unstructured_client/jobs.py b/src/unstructured_client/jobs.py index 46e5f225..6c69babf 100644 --- a/src/unstructured_client/jobs.py +++ b/src/unstructured_client/jobs.py @@ -639,6 +639,428 @@ async def get_job_async( http_res, ) + def get_job_details( + self, + *, + request: Union[ + operations.GetJobDetailsRequest, operations.GetJobDetailsRequestTypedDict + ], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> operations.GetJobDetailsResponse: + r"""Get Job processing details + + Retrieve processing details for a specific job by its ID. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, operations.GetJobDetailsRequest) + request = cast(operations.GetJobDetailsRequest, request) + + req = self._build_request( + method="GET", + path="/api/v1/jobs/{job_id}/details", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(3000, 720000, 1.88, 1800000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5xx"]) + + http_res = self.do_request( + hook_ctx=HookContext( + base_url=base_url or "", + operation_id="get_job_details", + oauth2_scopes=[], + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.GetJobDetailsResponse( + job_details=utils.unmarshal_json( + http_res.text, Optional[shared.JobDetails] + ), + status_code=http_res.status_code, + content_type=http_res.headers.get("Content-Type") or "", + raw_response=http_res, + ) + if utils.match_response(http_res, "422", "application/json"): + response_data = utils.unmarshal_json( + http_res.text, errors.HTTPValidationErrorData + ) + raise errors.HTTPValidationError(data=response_data) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + + content_type = http_res.headers.get("Content-Type") + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + f"Unexpected response received (code: {http_res.status_code}, type: {content_type})", + http_res.status_code, + http_res_text, + http_res, + ) + + async def get_job_details_async( + self, + *, + request: Union[ + operations.GetJobDetailsRequest, operations.GetJobDetailsRequestTypedDict + ], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> operations.GetJobDetailsResponse: + r"""Get Job processing details + + Retrieve processing details for a specific job by its ID. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, operations.GetJobDetailsRequest) + request = cast(operations.GetJobDetailsRequest, request) + + req = self._build_request_async( + method="GET", + path="/api/v1/jobs/{job_id}/details", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(3000, 720000, 1.88, 1800000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5xx"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + base_url=base_url or "", + operation_id="get_job_details", + oauth2_scopes=[], + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.GetJobDetailsResponse( + job_details=utils.unmarshal_json( + http_res.text, Optional[shared.JobDetails] + ), + status_code=http_res.status_code, + content_type=http_res.headers.get("Content-Type") or "", + raw_response=http_res, + ) + if utils.match_response(http_res, "422", "application/json"): + response_data = utils.unmarshal_json( + http_res.text, errors.HTTPValidationErrorData + ) + raise errors.HTTPValidationError(data=response_data) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + + content_type = http_res.headers.get("Content-Type") + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + f"Unexpected response received (code: {http_res.status_code}, type: {content_type})", + http_res.status_code, + http_res_text, + http_res, + ) + + def get_job_failed_files( + self, + *, + request: Union[ + operations.GetJobFailedFilesRequest, + operations.GetJobFailedFilesRequestTypedDict, + ], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> operations.GetJobFailedFilesResponse: + r"""Get Job Failed Files + + Retrieve failed files for a specific job by its ID. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, operations.GetJobFailedFilesRequest) + request = cast(operations.GetJobFailedFilesRequest, request) + + req = self._build_request( + method="GET", + path="/api/v1/jobs/{job_id}/failed-files", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(3000, 720000, 1.88, 1800000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5xx"]) + + http_res = self.do_request( + hook_ctx=HookContext( + base_url=base_url or "", + operation_id="get_job_failed_files", + oauth2_scopes=[], + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.GetJobFailedFilesResponse( + job_failed_files=utils.unmarshal_json( + http_res.text, Optional[shared.JobFailedFiles] + ), + status_code=http_res.status_code, + content_type=http_res.headers.get("Content-Type") or "", + raw_response=http_res, + ) + if utils.match_response(http_res, "422", "application/json"): + response_data = utils.unmarshal_json( + http_res.text, errors.HTTPValidationErrorData + ) + raise errors.HTTPValidationError(data=response_data) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + + content_type = http_res.headers.get("Content-Type") + http_res_text = utils.stream_to_text(http_res) + raise errors.SDKError( + f"Unexpected response received (code: {http_res.status_code}, type: {content_type})", + http_res.status_code, + http_res_text, + http_res, + ) + + async def get_job_failed_files_async( + self, + *, + request: Union[ + operations.GetJobFailedFilesRequest, + operations.GetJobFailedFilesRequestTypedDict, + ], + retries: OptionalNullable[utils.RetryConfig] = UNSET, + server_url: Optional[str] = None, + timeout_ms: Optional[int] = None, + http_headers: Optional[Mapping[str, str]] = None, + ) -> operations.GetJobFailedFilesResponse: + r"""Get Job Failed Files + + Retrieve failed files for a specific job by its ID. + + :param request: The request object to send. + :param retries: Override the default retry configuration for this method + :param server_url: Override the default server URL for this method + :param timeout_ms: Override the default request timeout configuration for this method in milliseconds + :param http_headers: Additional headers to set or replace on requests. + """ + base_url = clean_server_url(server_url) if server_url is not None else self.get_default_server_url() + url_variables = None + if timeout_ms is None: + timeout_ms = self.sdk_configuration.timeout_ms + + if not isinstance(request, BaseModel): + request = utils.unmarshal(request, operations.GetJobFailedFilesRequest) + request = cast(operations.GetJobFailedFilesRequest, request) + + req = self._build_request_async( + method="GET", + path="/api/v1/jobs/{job_id}/failed-files", + base_url=base_url, + url_variables=url_variables, + request=request, + request_body_required=False, + request_has_path_params=True, + request_has_query_params=True, + user_agent_header="user-agent", + accept_header_value="application/json", + http_headers=http_headers, + security=self.sdk_configuration.security, + timeout_ms=timeout_ms, + ) + + if retries == UNSET: + if self.sdk_configuration.retry_config is not UNSET: + retries = self.sdk_configuration.retry_config + else: + retries = utils.RetryConfig( + "backoff", utils.BackoffStrategy(3000, 720000, 1.88, 1800000), True + ) + + retry_config = None + if isinstance(retries, utils.RetryConfig): + retry_config = (retries, ["5xx"]) + + http_res = await self.do_request_async( + hook_ctx=HookContext( + base_url=base_url or "", + operation_id="get_job_failed_files", + oauth2_scopes=[], + security_source=self.sdk_configuration.security, + ), + request=req, + error_status_codes=["422", "4XX", "5XX"], + retry_config=retry_config, + ) + + response_data: Any = None + if utils.match_response(http_res, "200", "application/json"): + return operations.GetJobFailedFilesResponse( + job_failed_files=utils.unmarshal_json( + http_res.text, Optional[shared.JobFailedFiles] + ), + status_code=http_res.status_code, + content_type=http_res.headers.get("Content-Type") or "", + raw_response=http_res, + ) + if utils.match_response(http_res, "422", "application/json"): + response_data = utils.unmarshal_json( + http_res.text, errors.HTTPValidationErrorData + ) + raise errors.HTTPValidationError(data=response_data) + if utils.match_response(http_res, "4XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + if utils.match_response(http_res, "5XX", "*"): + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + "API error occurred", http_res.status_code, http_res_text, http_res + ) + + content_type = http_res.headers.get("Content-Type") + http_res_text = await utils.stream_to_text_async(http_res) + raise errors.SDKError( + f"Unexpected response received (code: {http_res.status_code}, type: {content_type})", + http_res.status_code, + http_res_text, + http_res, + ) + def list_jobs( self, *,