numind 0.3.2__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. {numind-0.3.2 → numind-0.4.0}/.github/workflows/tests.yml +1 -1
  2. {numind-0.3.2 → numind-0.4.0}/PKG-INFO +62 -98
  3. {numind-0.3.2 → numind-0.4.0}/README.md +48 -84
  4. numind-0.4.0/docs/InferenceApi.md +348 -0
  5. numind-0.3.2/docs/InferenceApi.md → numind-0.4.0/docs/StructuredDataExtractionApi.md +208 -243
  6. {numind-0.3.2 → numind-0.4.0}/docs/StructuredInferenceExample.md +1 -1
  7. {numind-0.3.2 → numind-0.4.0}/docs/TemplateGenerationApi.md +104 -1
  8. {numind-0.3.2 → numind-0.4.0}/pyproject.toml +7 -6
  9. {numind-0.3.2 → numind-0.4.0}/sdk_generation/pyproject_base.toml +15 -25
  10. {numind-0.3.2 → numind-0.4.0}/src/numind/models/health_response.py +3 -2
  11. {numind-0.3.2 → numind-0.4.0}/src/numind/models/paginated_response_t.py +3 -2
  12. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured_extraction_response.py +5 -2
  13. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured_inference_example.py +4 -2
  14. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/data_correction.py +13 -2
  15. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/bic.py +12 -4
  16. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/email_address.py +19 -8
  17. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/iban.py +12 -4
  18. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/integer.py +9 -6
  19. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/language_tag.py +2 -3
  20. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/number.py +11 -6
  21. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/phone_number.py +26 -5
  22. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/rfc3987.py +14 -3
  23. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/unit_code.py +2 -3
  24. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/verbatim_string.py +89 -38
  25. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/template_conversion/json_schema.py +12 -0
  26. numind-0.4.0/src/numind/numind.py +680 -0
  27. numind-0.3.2/src/numind/openapi_client/api/structured_data_extraction_api.py → numind-0.4.0/src/numind/openapi_client/api/inference_api.py +482 -173
  28. numind-0.3.2/src/numind/openapi_client/api/inference_api.py → numind-0.4.0/src/numind/openapi_client/api/structured_data_extraction_api.py +555 -785
  29. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/template_generation_api.py +323 -0
  30. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api_client.py +49 -9
  31. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/configuration.py +36 -5
  32. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/rest.py +29 -8
  33. numind-0.3.2/src/numind/openapi_client_async/api/structured_data_extraction_api.py → numind-0.4.0/src/numind/openapi_client_async/api/inference_api.py +482 -173
  34. numind-0.3.2/src/numind/openapi_client_async/api/inference_api.py → numind-0.4.0/src/numind/openapi_client_async/api/structured_data_extraction_api.py +555 -785
  35. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/template_generation_api.py +323 -0
  36. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api_client.py +49 -9
  37. {numind-0.3.2 → numind-0.4.0}/tests/conftest.py +17 -0
  38. numind-0.4.0/tests/nuextract_utils/test_optional_dependencies.py +131 -0
  39. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_inference_api.py +0 -6
  40. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_data_extraction_api.py +6 -0
  41. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_inference_example.py +0 -1
  42. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_template_generation_api.py +3 -0
  43. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_inference_api.py +0 -8
  44. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_data_extraction_api.py +8 -0
  45. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_inference_example.py +0 -1
  46. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_template_generation_api.py +3 -0
  47. {numind-0.3.2 → numind-0.4.0}/tests/test_conversion_json_schema.py +33 -0
  48. numind-0.4.0/tests/test_extract_structured_data.py +184 -0
  49. numind-0.4.0/tests/test_numarkdown.py +150 -0
  50. {numind-0.3.2 → numind-0.4.0}/tests/test_project.py +50 -16
  51. numind-0.3.2/docs/StructuredDataExtractionApi.md +0 -236
  52. numind-0.3.2/src/numind/numind.py +0 -558
  53. numind-0.3.2/tests/test_numarkdown.py +0 -27
  54. {numind-0.3.2 → numind-0.4.0}/.github/codecov.yml +0 -0
  55. {numind-0.3.2 → numind-0.4.0}/.github/dependabot.yml +0 -0
  56. {numind-0.3.2 → numind-0.4.0}/.github/workflows/lint.yml +0 -0
  57. {numind-0.3.2 → numind-0.4.0}/.github/workflows/publish-pypi.yml +0 -0
  58. {numind-0.3.2 → numind-0.4.0}/.github/workflows/sdk-auto-update.yml +0 -0
  59. {numind-0.3.2 → numind-0.4.0}/.github/workflows/update-api-build-version-repo-var.yml +0 -0
  60. {numind-0.3.2 → numind-0.4.0}/.gitignore +0 -0
  61. {numind-0.3.2 → numind-0.4.0}/LICENSE +0 -0
  62. {numind-0.3.2 → numind-0.4.0}/docs/Content.md +0 -0
  63. {numind-0.3.2 → numind-0.4.0}/docs/ContentExtractionApi.md +0 -0
  64. {numind-0.3.2 → numind-0.4.0}/docs/ContentExtractionProjectManagementApi.md +0 -0
  65. {numind-0.3.2 → numind-0.4.0}/docs/ContentExtractionResponse.md +0 -0
  66. {numind-0.3.2 → numind-0.4.0}/docs/ContentProjectResponse.md +0 -0
  67. {numind-0.3.2 → numind-0.4.0}/docs/ContentProjectSettingsResponse.md +0 -0
  68. {numind-0.3.2 → numind-0.4.0}/docs/ConvertRequest.md +0 -0
  69. {numind-0.3.2 → numind-0.4.0}/docs/CreateContentProjectRequest.md +0 -0
  70. {numind-0.3.2 → numind-0.4.0}/docs/CreateOrUpdateStructuredExampleRequest.md +0 -0
  71. {numind-0.3.2 → numind-0.4.0}/docs/CreateStructuredProjectRequest.md +0 -0
  72. {numind-0.3.2 → numind-0.4.0}/docs/DefaultApi.md +0 -0
  73. {numind-0.3.2 → numind-0.4.0}/docs/DocumentInfo.md +0 -0
  74. {numind-0.3.2 → numind-0.4.0}/docs/DocumentResponse.md +0 -0
  75. {numind-0.3.2 → numind-0.4.0}/docs/DocumentsApi.md +0 -0
  76. {numind-0.3.2 → numind-0.4.0}/docs/Error.md +0 -0
  77. {numind-0.3.2 → numind-0.4.0}/docs/FileResponse.md +0 -0
  78. {numind-0.3.2 → numind-0.4.0}/docs/FilesApi.md +0 -0
  79. {numind-0.3.2 → numind-0.4.0}/docs/HealthResponse.md +0 -0
  80. {numind-0.3.2 → numind-0.4.0}/docs/ImageInfo.md +0 -0
  81. {numind-0.3.2 → numind-0.4.0}/docs/ImportProjectResponse.md +0 -0
  82. {numind-0.3.2 → numind-0.4.0}/docs/InferenceStatus.md +0 -0
  83. {numind-0.3.2 → numind-0.4.0}/docs/InferenceValidationError.md +0 -0
  84. {numind-0.3.2 → numind-0.4.0}/docs/InformationResponse.md +0 -0
  85. {numind-0.3.2 → numind-0.4.0}/docs/InvalidInformation.md +0 -0
  86. {numind-0.3.2 → numind-0.4.0}/docs/JobIdResponse.md +0 -0
  87. {numind-0.3.2 → numind-0.4.0}/docs/JobStatusResponse.md +0 -0
  88. {numind-0.3.2 → numind-0.4.0}/docs/JobsApi.md +0 -0
  89. {numind-0.3.2 → numind-0.4.0}/docs/PaginatedResponseT.md +0 -0
  90. {numind-0.3.2 → numind-0.4.0}/docs/ProjectImportExportApi.md +0 -0
  91. {numind-0.3.2 → numind-0.4.0}/docs/ServiceStatus.md +0 -0
  92. {numind-0.3.2 → numind-0.4.0}/docs/Structured.md +0 -0
  93. {numind-0.3.2 → numind-0.4.0}/docs/StructuredExampleResponse.md +0 -0
  94. {numind-0.3.2 → numind-0.4.0}/docs/StructuredExtractionExamplesApi.md +0 -0
  95. {numind-0.3.2 → numind-0.4.0}/docs/StructuredExtractionProjectManagementApi.md +0 -0
  96. {numind-0.3.2 → numind-0.4.0}/docs/StructuredExtractionResponse.md +0 -0
  97. {numind-0.3.2 → numind-0.4.0}/docs/StructuredProjectResponse.md +0 -0
  98. {numind-0.3.2 → numind-0.4.0}/docs/StructuredProjectSettingsResponse.md +0 -0
  99. {numind-0.3.2 → numind-0.4.0}/docs/TemplateRequest.md +0 -0
  100. {numind-0.3.2 → numind-0.4.0}/docs/TemplateResponse.md +0 -0
  101. {numind-0.3.2 → numind-0.4.0}/docs/TextInfo.md +0 -0
  102. {numind-0.3.2 → numind-0.4.0}/docs/TextRequest.md +0 -0
  103. {numind-0.3.2 → numind-0.4.0}/docs/UpdateContentProjectRequest.md +0 -0
  104. {numind-0.3.2 → numind-0.4.0}/docs/UpdateContentProjectSettingsRequest.md +0 -0
  105. {numind-0.3.2 → numind-0.4.0}/docs/UpdateStructuredProjectRequest.md +0 -0
  106. {numind-0.3.2 → numind-0.4.0}/docs/UpdateStructuredProjectSettingsRequest.md +0 -0
  107. {numind-0.3.2 → numind-0.4.0}/docs/ValidInformation.md +0 -0
  108. {numind-0.3.2 → numind-0.4.0}/docs/VersionResponse.md +0 -0
  109. {numind-0.3.2 → numind-0.4.0}/sdk_generation/.openapi-generator-ignore +0 -0
  110. {numind-0.3.2 → numind-0.4.0}/sdk_generation/adapt_openapi_client_init.py +0 -0
  111. {numind-0.3.2 → numind-0.4.0}/sdk_generation/adapt_pyproject.py +0 -0
  112. {numind-0.3.2 → numind-0.4.0}/sdk_generation/collate_documentation_readme.py +0 -0
  113. {numind-0.3.2 → numind-0.4.0}/sdk_generation/config.json +0 -0
  114. {numind-0.3.2 → numind-0.4.0}/sdk_generation/gen_sdk.sh +0 -0
  115. {numind-0.3.2 → numind-0.4.0}/sdk_generation/remove_unused_models_from_openapi_spec_file.py +0 -0
  116. {numind-0.3.2 → numind-0.4.0}/src/numind/__init__.py +0 -0
  117. {numind-0.3.2 → numind-0.4.0}/src/numind/api_response.py +0 -0
  118. {numind-0.3.2 → numind-0.4.0}/src/numind/constants.py +0 -0
  119. {numind-0.3.2 → numind-0.4.0}/src/numind/exceptions.py +0 -0
  120. {numind-0.3.2 → numind-0.4.0}/src/numind/models/__init__.py +0 -0
  121. {numind-0.3.2 → numind-0.4.0}/src/numind/models/content.py +0 -0
  122. {numind-0.3.2 → numind-0.4.0}/src/numind/models/content_extraction_response.py +0 -0
  123. {numind-0.3.2 → numind-0.4.0}/src/numind/models/content_project_response.py +0 -0
  124. {numind-0.3.2 → numind-0.4.0}/src/numind/models/content_project_settings_response.py +0 -0
  125. {numind-0.3.2 → numind-0.4.0}/src/numind/models/convert_request.py +0 -0
  126. {numind-0.3.2 → numind-0.4.0}/src/numind/models/create_content_project_request.py +0 -0
  127. {numind-0.3.2 → numind-0.4.0}/src/numind/models/create_or_update_structured_example_request.py +0 -0
  128. {numind-0.3.2 → numind-0.4.0}/src/numind/models/create_structured_project_request.py +0 -0
  129. {numind-0.3.2 → numind-0.4.0}/src/numind/models/document_info.py +0 -0
  130. {numind-0.3.2 → numind-0.4.0}/src/numind/models/document_response.py +0 -0
  131. {numind-0.3.2 → numind-0.4.0}/src/numind/models/error.py +0 -0
  132. {numind-0.3.2 → numind-0.4.0}/src/numind/models/file_response.py +0 -0
  133. {numind-0.3.2 → numind-0.4.0}/src/numind/models/image_info.py +0 -0
  134. {numind-0.3.2 → numind-0.4.0}/src/numind/models/import_project_response.py +0 -0
  135. {numind-0.3.2 → numind-0.4.0}/src/numind/models/inference_status.py +0 -0
  136. {numind-0.3.2 → numind-0.4.0}/src/numind/models/inference_validation_error.py +0 -0
  137. {numind-0.3.2 → numind-0.4.0}/src/numind/models/information_response.py +0 -0
  138. {numind-0.3.2 → numind-0.4.0}/src/numind/models/invalid_information.py +0 -0
  139. {numind-0.3.2 → numind-0.4.0}/src/numind/models/job_id_response.py +0 -0
  140. {numind-0.3.2 → numind-0.4.0}/src/numind/models/job_status_response.py +0 -0
  141. {numind-0.3.2 → numind-0.4.0}/src/numind/models/service_status.py +0 -0
  142. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured.py +0 -0
  143. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured_example_response.py +0 -0
  144. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured_project_response.py +0 -0
  145. {numind-0.3.2 → numind-0.4.0}/src/numind/models/structured_project_settings_response.py +0 -0
  146. {numind-0.3.2 → numind-0.4.0}/src/numind/models/template_request.py +0 -0
  147. {numind-0.3.2 → numind-0.4.0}/src/numind/models/template_response.py +0 -0
  148. {numind-0.3.2 → numind-0.4.0}/src/numind/models/text_info.py +0 -0
  149. {numind-0.3.2 → numind-0.4.0}/src/numind/models/text_request.py +0 -0
  150. {numind-0.3.2 → numind-0.4.0}/src/numind/models/update_content_project_request.py +0 -0
  151. {numind-0.3.2 → numind-0.4.0}/src/numind/models/update_content_project_settings_request.py +0 -0
  152. {numind-0.3.2 → numind-0.4.0}/src/numind/models/update_structured_project_request.py +0 -0
  153. {numind-0.3.2 → numind-0.4.0}/src/numind/models/update_structured_project_settings_request.py +0 -0
  154. {numind-0.3.2 → numind-0.4.0}/src/numind/models/valid_information.py +0 -0
  155. {numind-0.3.2 → numind-0.4.0}/src/numind/models/version_response.py +0 -0
  156. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/__init__.py +0 -0
  157. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/CLDR likelySubtags.xml +0 -0
  158. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/CLDR supplementalData.xml +0 -0
  159. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/IANA language subtag registry.txt +0 -0
  160. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/IANA tlds.txt +0 -0
  161. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ISO 15924.csv +0 -0
  162. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ISO 3166-1.csv +0 -0
  163. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ISO 3166-2.csv +0 -0
  164. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ISO 4217 list-one.csv +0 -0
  165. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ISO 4217 list-three.csv +0 -0
  166. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/__init__.py +0 -0
  167. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/iso-639-3.tab +0 -0
  168. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/iso-639-3_Retirements.tab +0 -0
  169. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/_iso_data/ucum-essence.xml +0 -0
  170. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/__init__.py +0 -0
  171. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/constants.py +0 -0
  172. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/data_validation.py +0 -0
  173. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/models.py +0 -0
  174. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/__init__.py +0 -0
  175. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/_utils.py +0 -0
  176. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/base.py +0 -0
  177. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/country.py +0 -0
  178. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/currency.py +0 -0
  179. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/date_time.py +0 -0
  180. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/duration.py +0 -0
  181. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/geolocation.py +0 -0
  182. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/language.py +0 -0
  183. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/region.py +0 -0
  184. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/script.py +0 -0
  185. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/string_.py +0 -0
  186. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/types/url.py +0 -0
  187. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/data_validation/utils.py +0 -0
  188. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/template_conversion/__init__.py +0 -0
  189. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/template_conversion/constants.py +0 -0
  190. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/template_conversion/pydantic.py +0 -0
  191. {numind-0.3.2 → numind-0.4.0}/src/numind/nuextract_utils/template_conversion/validation.py +0 -0
  192. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/__init__.py +0 -0
  193. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/__init__.py +0 -0
  194. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/content_extraction_api.py +0 -0
  195. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/content_extraction_project_management_api.py +0 -0
  196. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/default_api.py +0 -0
  197. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/documents_api.py +0 -0
  198. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/files_api.py +0 -0
  199. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/jobs_api.py +0 -0
  200. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/project_import_export_api.py +0 -0
  201. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/structured_extraction_examples_api.py +0 -0
  202. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/api/structured_extraction_project_management_api.py +0 -0
  203. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client/py.typed +0 -0
  204. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/__init__.py +0 -0
  205. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/__init__.py +0 -0
  206. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/content_extraction_api.py +0 -0
  207. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/content_extraction_project_management_api.py +0 -0
  208. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/default_api.py +0 -0
  209. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/documents_api.py +0 -0
  210. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/files_api.py +0 -0
  211. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/jobs_api.py +0 -0
  212. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/project_import_export_api.py +0 -0
  213. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/structured_extraction_examples_api.py +0 -0
  214. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/api/structured_extraction_project_management_api.py +0 -0
  215. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/configuration.py +0 -0
  216. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/py.typed +0 -0
  217. {numind-0.3.2 → numind-0.4.0}/src/numind/openapi_client_async/rest.py +0 -0
  218. {numind-0.3.2 → numind-0.4.0}/tests/__init__.py +0 -0
  219. {numind-0.3.2 → numind-0.4.0}/tests/json_schema_test_cases/1.json +0 -0
  220. {numind-0.3.2 → numind-0.4.0}/tests/nuextract_utils/__init__.py +0 -0
  221. {numind-0.3.2 → numind-0.4.0}/tests/nuextract_utils/test_error_detection.py +0 -0
  222. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/__init__.py +0 -0
  223. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content.py +0 -0
  224. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content_extraction_api.py +0 -0
  225. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content_extraction_project_management_api.py +0 -0
  226. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content_extraction_response.py +0 -0
  227. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content_project_response.py +0 -0
  228. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_content_project_settings_response.py +0 -0
  229. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_convert_request.py +0 -0
  230. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_create_content_project_request.py +0 -0
  231. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_create_or_update_structured_example_request.py +0 -0
  232. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_create_structured_project_request.py +0 -0
  233. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_default_api.py +0 -0
  234. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_document_info.py +0 -0
  235. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_document_response.py +0 -0
  236. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_documents_api.py +0 -0
  237. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_error.py +0 -0
  238. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_file_response.py +0 -0
  239. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_files_api.py +0 -0
  240. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_health_response.py +0 -0
  241. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_image_info.py +0 -0
  242. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_import_project_response.py +0 -0
  243. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_inference_status.py +0 -0
  244. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_inference_validation_error.py +0 -0
  245. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_information_response.py +0 -0
  246. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_invalid_information.py +0 -0
  247. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_job_id_response.py +0 -0
  248. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_job_status_response.py +0 -0
  249. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_jobs_api.py +0 -0
  250. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_paginated_response_t.py +0 -0
  251. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_project_import_export_api.py +0 -0
  252. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_service_status.py +0 -0
  253. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured.py +0 -0
  254. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_example_response.py +0 -0
  255. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_extraction_examples_api.py +0 -0
  256. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_extraction_project_management_api.py +0 -0
  257. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_extraction_response.py +0 -0
  258. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_project_response.py +0 -0
  259. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_structured_project_settings_response.py +0 -0
  260. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_template_request.py +0 -0
  261. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_template_response.py +0 -0
  262. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_text_info.py +0 -0
  263. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_text_request.py +0 -0
  264. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_update_content_project_request.py +0 -0
  265. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_update_content_project_settings_request.py +0 -0
  266. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_update_structured_project_request.py +0 -0
  267. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_update_structured_project_settings_request.py +0 -0
  268. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_valid_information.py +0 -0
  269. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client/test_version_response.py +0 -0
  270. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/__init__.py +0 -0
  271. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content.py +0 -0
  272. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content_extraction_api.py +0 -0
  273. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content_extraction_project_management_api.py +0 -0
  274. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content_extraction_response.py +0 -0
  275. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content_project_response.py +0 -0
  276. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_content_project_settings_response.py +0 -0
  277. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_convert_request.py +0 -0
  278. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_create_content_project_request.py +0 -0
  279. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_create_or_update_structured_example_request.py +0 -0
  280. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_create_structured_project_request.py +0 -0
  281. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_default_api.py +0 -0
  282. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_document_info.py +0 -0
  283. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_document_response.py +0 -0
  284. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_documents_api.py +0 -0
  285. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_error.py +0 -0
  286. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_file_response.py +0 -0
  287. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_files_api.py +0 -0
  288. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_health_response.py +0 -0
  289. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_image_info.py +0 -0
  290. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_import_project_response.py +0 -0
  291. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_inference_status.py +0 -0
  292. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_inference_validation_error.py +0 -0
  293. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_information_response.py +0 -0
  294. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_invalid_information.py +0 -0
  295. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_job_id_response.py +0 -0
  296. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_job_status_response.py +0 -0
  297. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_jobs_api.py +0 -0
  298. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_paginated_response_t.py +0 -0
  299. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_project_import_export_api.py +0 -0
  300. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_service_status.py +0 -0
  301. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured.py +0 -0
  302. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_example_response.py +0 -0
  303. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_extraction_examples_api.py +0 -0
  304. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_extraction_project_management_api.py +0 -0
  305. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_extraction_response.py +0 -0
  306. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_project_response.py +0 -0
  307. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_structured_project_settings_response.py +0 -0
  308. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_template_request.py +0 -0
  309. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_template_response.py +0 -0
  310. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_text_info.py +0 -0
  311. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_text_request.py +0 -0
  312. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_update_content_project_request.py +0 -0
  313. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_update_content_project_settings_request.py +0 -0
  314. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_update_structured_project_request.py +0 -0
  315. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_update_structured_project_settings_request.py +0 -0
  316. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_valid_information.py +0 -0
  317. {numind-0.3.2 → numind-0.4.0}/tests/openapi_client_async/test_version_response.py +0 -0
  318. {numind-0.3.2 → numind-0.4.0}/tests/test_cases/vacation/examples.csv +0 -0
  319. {numind-0.3.2 → numind-0.4.0}/tests/test_cases/vacation/files/tahiti.docx +0 -0
  320. {numind-0.3.2 → numind-0.4.0}/tests/test_cases/vacation/files_examples/kyoto.docx +0 -0
  321. {numind-0.3.2 → numind-0.4.0}/tests/test_cases/vacation/schema.json +0 -0
  322. {numind-0.3.2 → numind-0.4.0}/tests/test_cases/vacation/texts.csv +0 -0
  323. {numind-0.3.2 → numind-0.4.0}/tests/test_conversion_pydantic.py +0 -0
  324. {numind-0.3.2 → numind-0.4.0}/tests/test_json_schema_descriptions.py +0 -0
@@ -26,7 +26,7 @@ jobs:
26
26
  python-version: ${{ matrix.python-version }}
27
27
 
28
28
  - name: Install the project
29
- run: uv sync --extra tests
29
+ run: uv sync --extra tests --extra data-validation
30
30
 
31
31
  - name: Run tests
32
32
  env:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: numind
3
- Version: 0.3.2
3
+ Version: 0.4.0
4
4
  Summary: SDK to interact with the NuMind models API.
5
5
  Project-URL: Homepage, https://github.com/numindai/nuextract-platform-sdk
6
6
  Project-URL: Repository, https://github.com/numindai/nuextract-platform-sdk.git
@@ -36,30 +36,21 @@ Classifier: License :: OSI Approved :: MIT License
36
36
  Classifier: Operating System :: OS Independent
37
37
  Classifier: Programming Language :: Python
38
38
  Classifier: Programming Language :: Python :: 3 :: Only
39
- Classifier: Programming Language :: Python :: 3.9
40
39
  Classifier: Programming Language :: Python :: 3.10
41
40
  Classifier: Programming Language :: Python :: 3.11
42
41
  Classifier: Programming Language :: Python :: 3.12
43
42
  Classifier: Programming Language :: Python :: 3.13
43
+ Classifier: Programming Language :: Python :: 3.14
44
+ Classifier: Programming Language :: Python :: 3.15
44
45
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
45
- Requires-Python: >=3.9
46
+ Requires-Python: >=3.10
46
47
  Requires-Dist: aiohttp-retry>=2.8.3
47
- Requires-Dist: aiohttp>=3.13.5
48
- Requires-Dist: cdifflib>=1.2.9
49
- Requires-Dist: defusedxml>=0.7.1
50
- Requires-Dist: emval>=0.1.3
51
- Requires-Dist: eval-type-backport>=0.2.2; python_version < '3.10'
48
+ Requires-Dist: aiohttp>=3.14.1
52
49
  Requires-Dist: json-repair>=0.44.1
53
50
  Requires-Dist: jsonschema
54
51
  Requires-Dist: orjson
55
- Requires-Dist: phonenumbers>=9.0.24
56
52
  Requires-Dist: pydantic>=2.11
57
53
  Requires-Dist: python-dateutil>=2.8.2
58
- Requires-Dist: rapidfuzz>=3.13.0
59
- Requires-Dist: regex>=2026.1.15
60
- Requires-Dist: schwifty>=2025.9.0
61
- Requires-Dist: stringzilla>=4.6.1
62
- Requires-Dist: sympy>=1.14.0
63
54
  Requires-Dist: typing-extensions>=4.7.1
64
55
  Requires-Dist: urllib3
65
56
  Provides-Extra: build
@@ -67,6 +58,15 @@ Requires-Dist: openapi-generator-cli; extra == 'build'
67
58
  Requires-Dist: pyyaml; extra == 'build'
68
59
  Requires-Dist: toml; extra == 'build'
69
60
  Requires-Dist: uv; extra == 'build'
61
+ Provides-Extra: data-validation
62
+ Requires-Dist: cdifflib>=1.2.9; extra == 'data-validation'
63
+ Requires-Dist: emval>=0.1.3; extra == 'data-validation'
64
+ Requires-Dist: phonenumbers>=9.0.24; extra == 'data-validation'
65
+ Requires-Dist: rapidfuzz>=3.13.0; extra == 'data-validation'
66
+ Requires-Dist: regex>=2026.1.15; extra == 'data-validation'
67
+ Requires-Dist: schwifty>=2025.9.0; extra == 'data-validation'
68
+ Requires-Dist: stringzilla>=4.6.1; extra == 'data-validation'
69
+ Requires-Dist: sympy>=1.14.0; extra == 'data-validation'
70
70
  Provides-Extra: tests
71
71
  Requires-Dist: pytest-asyncio; extra == 'tests'
72
72
  Requires-Dist: pytest-cov; extra == 'tests'
@@ -92,7 +92,6 @@ You must first get an API key on the [NuExtract platform](https://nuextract.ai/a
92
92
 
93
93
  ```python
94
94
  import os
95
-
96
95
  from numind import NuMind
97
96
 
98
97
  # Create a client object to interact with the API
@@ -101,60 +100,30 @@ from numind import NuMind
101
100
  client = NuMind(api_key=os.environ["NUMIND_API_KEY"])
102
101
  ```
103
102
 
104
- ### Create an async client
105
-
106
- You can create an **async** client by using the `NuMindAsync` class:
107
-
108
- ```python
109
- import asyncio
110
- from numind import NuMindAsync
111
-
112
- client = NuMindAsync(api_key="API_KEY")
113
- requests = [{}]
114
-
115
-
116
- async def main():
117
- return [
118
- await client.extract_structured_data(project_id, **request_kwargs)
119
- for request_kwargs in requests
120
- ]
121
-
122
-
123
- responses = asyncio.run(main())
124
- ```
125
-
126
- The methods and their usages are the same as for the sync `NuMind` client except that API methods are coroutines that must be awaited.
103
+ You can create an **async** client by using the `NuMindAsync` class.
104
+ The methods and their usages are the same as for the sync `NuMind` client.
127
105
 
128
- ### NuExtract: Extract structured information "on the fly"
106
+ ### Extract structured data
129
107
 
130
- If you want to extract structured information from data without projects but just by providing the input template, you can use the `extract` method which provides a more user-friendly way to interact with the API:
108
+ If you want to extract structured information without a project, provide the template directly to `extract_structured_data`:
131
109
 
132
110
  ```python
133
111
  template = {
134
112
  "destination": {
135
113
  "name": "verbatim-string",
136
114
  "zip_code": "string",
137
- "country": "string",
115
+ "country": "country",
138
116
  },
139
117
  "accommodation": "verbatim-string",
140
118
  "activities": ["verbatim-string"],
141
- "duration": {
142
- "time_unit": ["day", "week", "month", "year"],
143
- "time_quantity": "integer",
144
- },
119
+ "duration": "duration",
145
120
  }
146
- input_text = """My dream vacation would be a month-long escape to the stunning islands of Tahiti.
147
- I’d stay in an overwater bungalow in Bora Bora, waking up to crystal-clear turquoise waters and breathtaking sunrises.
148
- Days would be spent snorkeling with vibrant marine life, paddleboarding over coral gardens, and basking on pristine white-sand beaches.
149
- I’d explore lush rainforests, hidden waterfalls, and the rich Polynesian culture through traditional dance, music, and cuisine.
150
- Evenings would be filled with romantic beachside dinners under the stars, with the soothing sound of waves as the perfect backdrop."""
151
-
152
- output = client.extract_structured_data(template=template, input_text=input_text)
153
- print(output)
154
-
155
- # Can also work with files, replace the path with your own
156
- # from pathlib import Path
157
- # output = client.extract(template=template, input_file="file.ppt")
121
+ input_file_path = Path("to", "file.pdf")
122
+ response = client.extract_structured_data(
123
+ template=template,
124
+ input_file=input_file_path,
125
+ )
126
+ print(response.result)
158
127
  ```
159
128
 
160
129
  ```json
@@ -162,7 +131,7 @@ print(output)
162
131
  "destination": {
163
132
  "name": "Tahiti",
164
133
  "zip_code": "98730",
165
- "country": "France"
134
+ "country": "FR"
166
135
  },
167
136
  "accommodation": "overwater bungalow in Bora Bora",
168
137
  "activities": [
@@ -171,16 +140,13 @@ print(output)
171
140
  "basking",
172
141
  "explore lush rainforests, hidden waterfalls, and the rich Polynesian culture"
173
142
  ],
174
- "duration": {
175
- "time_unit": null,
176
- "time_quantity": null
177
- }
143
+ "duration": null
178
144
  }
179
145
  ```
180
146
 
181
147
  ### Create a good template
182
148
 
183
- NuExtract uses JSON extraction templates which specify the information to retrieve and their types, which are:
149
+ NuExtract uses JSON extraction templates which specify the information to retrieve and their types:
184
150
 
185
151
  * **string**: a text, whose value can be abstract, i.e. totally free and can be deduced from calculations, reasoning, external knowledge;
186
152
  * **verbatim-string**: a purely extractive text whose value must be present in the document. Some flexibility might be allowed on the formatting, e.g. new lines and escaped characters (e.g. `\n`) in a documents might be represented with a space;
@@ -231,16 +197,26 @@ otherwise it is `None`, and `incompatibilities` identifies the affected location
231
197
 
232
198
  ### Inferring a template
233
199
 
234
- The "infer_template" method allows to quickly create a template that you can start to work with from a text description.
200
+ Template generation is asynchronous. Submit a natural-language description, poll the job status, and retrieve the generated template once complete.
235
201
 
236
202
  ```python
237
- from numind.openapi_client import TemplateRequest
238
- from pydantic import StrictStr
203
+ import time
204
+
205
+ from numind.models import TemplateRequest
239
206
 
240
207
  description = "Create a template that extracts key information from an order confirmation email. The template should be able to pull details like the order ID, customer ID, date and time of the order, status, total amount, currency, item details (product ID, quantity, and unit price), shipping address, any customer requests or delivery preferences, and the estimated delivery date."
241
- input_schema = client.post_api_infer_template(
242
- template_request=TemplateRequest(description=StrictStr(description))
243
- )
208
+ job_id = client.post_api_template_generation_jobs_text(
209
+ TemplateRequest(description=description)
210
+ ).job_id
211
+
212
+ job_status = client.get_api_jobs_jobid_status(job_id)
213
+ while job_status.completed_at is None:
214
+ time.sleep(4)
215
+ job_status = client.get_api_jobs_jobid_status(job_id)
216
+ if job_status.status != "completed":
217
+ raise RuntimeError(f"Template generation failed with status {job_status.status}")
218
+
219
+ template = client.get_api_template_generation_jobs_templatejobid(job_id).result
244
220
  ```
245
221
 
246
222
  ### Create a project
@@ -248,15 +224,16 @@ input_schema = client.post_api_infer_template(
248
224
  A project allows to define an information extraction task from a template and examples.
249
225
 
250
226
  ```python
251
- from numind.openapi_client import CreateProjectRequest
227
+ from numind.models import CreateStructuredProjectRequest
252
228
 
253
229
  project_id = client.post_api_structured_extraction(
254
- CreateProjectRequest(
230
+ CreateStructuredProjectRequest(
255
231
  name="vacation",
256
232
  description="Extraction of locations and activities",
257
233
  template=template,
234
+ instructions="",
258
235
  )
259
- )
236
+ ).id
260
237
  ```
261
238
 
262
239
  The `project_id` can also be found in the "API" tab of a project on the NuExtract website.
@@ -271,8 +248,7 @@ example_1_input = "This is a text example"
271
248
  example_1_expected_output = {
272
249
  "destination": {"name": None, "zip_code": None, "country": None}
273
250
  }
274
- with Path("example_2.odt").open("rb") as file: # read bytes
275
- example_2_input = file.read()
251
+ example_2_input = Path("example_2.odt")
276
252
  example_2_expected_output = {
277
253
  "destination": {"name": None, "zip_code": None, "country": None}
278
254
  }
@@ -285,34 +261,21 @@ examples = [
285
261
  client.add_examples_to_structured_extraction_project(project_id, examples)
286
262
  ```
287
263
 
288
- ### Extract structured information from text
289
-
290
- ```python
291
- output_schema = client.extract_structured_data(project_id, input_text=input_text)
292
- ```
293
-
294
- ### Extract structured information from a file
295
-
296
- ```python
297
- from pathlib import Path
298
-
299
- file_path = Path("document.odt")
300
- with file_path.open("rb") as file:
301
- input_file = file.read()
302
- output_schema = client.extract(project_id, input_file=input_file)
303
- ```
304
-
305
- ### NuMarkdown: Convert a document to a RAG-ready Markdown
264
+ ### Convert a document to a RAG-ready Markdown
306
265
 
307
266
  ```python
308
267
  from pathlib import Path
309
268
 
310
269
  file_path = Path("document.pdf")
311
- with file_path.open("rb") as file:
312
- input_file = file.read()
313
- markdown = client.extract_content(input_file)
270
+ response = client.extract_content(file_path, job_status_polling_delay=2.0)
271
+ print(response.result)
314
272
  ```
315
273
 
274
+ `extract_structured_data` and `extract_content` poll job status every four seconds by
275
+ default. Use `job_status_polling_delay` to select a different interval in seconds.
276
+ Failed jobs raise `RuntimeError` by default. Set `raise_on_job_fail=False` to return a
277
+ `FailedJobStatusResponse` containing the complete job status and its failure reason.
278
+
316
279
  # Documentation
317
280
 
318
281
  ### Extracting Information from Documents
@@ -404,7 +367,7 @@ This Python package is automatically generated by the [OpenAPI Generator](https:
404
367
 
405
368
  - API version:
406
369
  - Package version: 1.0.0
407
- - Generator version: 7.24.0
370
+ - Generator version: 7.25.0
408
371
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
409
372
 
410
373
  ### Documentation for API Endpoints
@@ -436,9 +399,7 @@ Class | Method | HTTP request | Description
436
399
  *FilesApi* | [**post_api_files_fileid_convert_to_document**](docs/FilesApi.md#post_api_files_fileid_convert_to_document) | **POST** /api/files/{fileId}/convert-to-document |
437
400
  *InferenceApi* | [**post_api_content_extraction_contentprojectid_jobs_document_documentid**](docs/InferenceApi.md#post_api_content_extraction_contentprojectid_jobs_document_documentid) | **POST** /api/content-extraction/{contentProjectId}/jobs/document/{documentId} |
438
401
  *InferenceApi* | [**post_api_structured_extraction_structuredprojectid_jobs_document_documentid**](docs/InferenceApi.md#post_api_structured_extraction_structuredprojectid_jobs_document_documentid) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/document/{documentId} |
439
- *InferenceApi* | [**post_api_structured_extraction_structuredprojectid_jobs_text**](docs/InferenceApi.md#post_api_structured_extraction_structuredprojectid_jobs_text) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/text |
440
402
  *InferenceApi* | [**post_api_template_generation_jobs_document_documentid**](docs/InferenceApi.md#post_api_template_generation_jobs_document_documentid) | **POST** /api/template-generation/jobs/document/{documentId} |
441
- *InferenceApi* | [**post_api_template_generation_jobs_text**](docs/InferenceApi.md#post_api_template_generation_jobs_text) | **POST** /api/template-generation/jobs/text |
442
403
  *JobsApi* | [**get_api_jobs**](docs/JobsApi.md#get_api_jobs) | **GET** /api/jobs |
443
404
  *JobsApi* | [**get_api_jobs_jobid_status**](docs/JobsApi.md#get_api_jobs_jobid_status) | **GET** /api/jobs/{jobId}/status |
444
405
  *JobsApi* | [**get_api_jobs_jobid_stream**](docs/JobsApi.md#get_api_jobs_jobid_stream) | **GET** /api/jobs/{jobId}/stream |
@@ -446,7 +407,9 @@ Class | Method | HTTP request | Description
446
407
  *ProjectImportExportApi* | [**get_api_extraction_projectkind_projectid_export**](docs/ProjectImportExportApi.md#get_api_extraction_projectkind_projectid_export) | **GET** /api/extraction/{projectKind}/{projectId}/export |
447
408
  *ProjectImportExportApi* | [**post_api_extraction_import**](docs/ProjectImportExportApi.md#post_api_extraction_import) | **POST** /api/extraction/import |
448
409
  *StructuredDataExtractionApi* | [**get_api_structured_extraction_jobs_structuredextractionjobid**](docs/StructuredDataExtractionApi.md#get_api_structured_extraction_jobs_structuredextractionjobid) | **GET** /api/structured-extraction/jobs/{structuredExtractionJobId} |
410
+ *StructuredDataExtractionApi* | [**post_api_structured_extraction_jobs**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_jobs) | **POST** /api/structured-extraction/jobs |
449
411
  *StructuredDataExtractionApi* | [**post_api_structured_extraction_structuredprojectid_jobs**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_structuredprojectid_jobs) | **POST** /api/structured-extraction/{structuredProjectId}/jobs |
412
+ *StructuredDataExtractionApi* | [**post_api_structured_extraction_structuredprojectid_jobs_text**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_structuredprojectid_jobs_text) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/text |
450
413
  *StructuredExtractionExamplesApi* | [**delete_api_structured_extraction_structuredprojectid_examples_structuredexampleid**](docs/StructuredExtractionExamplesApi.md#delete_api_structured_extraction_structuredprojectid_examples_structuredexampleid) | **DELETE** /api/structured-extraction/{structuredProjectId}/examples/{structuredExampleId} |
451
414
  *StructuredExtractionExamplesApi* | [**get_api_structured_extraction_structuredprojectid_examples**](docs/StructuredExtractionExamplesApi.md#get_api_structured_extraction_structuredprojectid_examples) | **GET** /api/structured-extraction/{structuredProjectId}/examples |
452
415
  *StructuredExtractionExamplesApi* | [**get_api_structured_extraction_structuredprojectid_examples_structuredexampleid**](docs/StructuredExtractionExamplesApi.md#get_api_structured_extraction_structuredprojectid_examples_structuredexampleid) | **GET** /api/structured-extraction/{structuredProjectId}/examples/{structuredExampleId} |
@@ -467,6 +430,7 @@ Class | Method | HTTP request | Description
467
430
  *StructuredExtractionProjectManagementApi* | [**post_api_structured_extraction_structuredprojectid_unshare**](docs/StructuredExtractionProjectManagementApi.md#post_api_structured_extraction_structuredprojectid_unshare) | **POST** /api/structured-extraction/{structuredProjectId}/unshare |
468
431
  *TemplateGenerationApi* | [**get_api_template_generation_jobs_templatejobid**](docs/TemplateGenerationApi.md#get_api_template_generation_jobs_templatejobid) | **GET** /api/template-generation/jobs/{templateJobId} |
469
432
  *TemplateGenerationApi* | [**post_api_template_generation_jobs**](docs/TemplateGenerationApi.md#post_api_template_generation_jobs) | **POST** /api/template-generation/jobs |
433
+ *TemplateGenerationApi* | [**post_api_template_generation_jobs_text**](docs/TemplateGenerationApi.md#post_api_template_generation_jobs_text) | **POST** /api/template-generation/jobs/text |
470
434
 
471
435
 
472
436
  ### Documentation For Models
@@ -16,7 +16,6 @@ You must first get an API key on the [NuExtract platform](https://nuextract.ai/a
16
16
 
17
17
  ```python
18
18
  import os
19
-
20
19
  from numind import NuMind
21
20
 
22
21
  # Create a client object to interact with the API
@@ -25,60 +24,30 @@ from numind import NuMind
25
24
  client = NuMind(api_key=os.environ["NUMIND_API_KEY"])
26
25
  ```
27
26
 
28
- ### Create an async client
29
-
30
- You can create an **async** client by using the `NuMindAsync` class:
31
-
32
- ```python
33
- import asyncio
34
- from numind import NuMindAsync
35
-
36
- client = NuMindAsync(api_key="API_KEY")
37
- requests = [{}]
38
-
39
-
40
- async def main():
41
- return [
42
- await client.extract_structured_data(project_id, **request_kwargs)
43
- for request_kwargs in requests
44
- ]
45
-
46
-
47
- responses = asyncio.run(main())
48
- ```
49
-
50
- The methods and their usages are the same as for the sync `NuMind` client except that API methods are coroutines that must be awaited.
27
+ You can create an **async** client by using the `NuMindAsync` class.
28
+ The methods and their usages are the same as for the sync `NuMind` client.
51
29
 
52
- ### NuExtract: Extract structured information "on the fly"
30
+ ### Extract structured data
53
31
 
54
- If you want to extract structured information from data without projects but just by providing the input template, you can use the `extract` method which provides a more user-friendly way to interact with the API:
32
+ If you want to extract structured information without a project, provide the template directly to `extract_structured_data`:
55
33
 
56
34
  ```python
57
35
  template = {
58
36
  "destination": {
59
37
  "name": "verbatim-string",
60
38
  "zip_code": "string",
61
- "country": "string",
39
+ "country": "country",
62
40
  },
63
41
  "accommodation": "verbatim-string",
64
42
  "activities": ["verbatim-string"],
65
- "duration": {
66
- "time_unit": ["day", "week", "month", "year"],
67
- "time_quantity": "integer",
68
- },
43
+ "duration": "duration",
69
44
  }
70
- input_text = """My dream vacation would be a month-long escape to the stunning islands of Tahiti.
71
- I’d stay in an overwater bungalow in Bora Bora, waking up to crystal-clear turquoise waters and breathtaking sunrises.
72
- Days would be spent snorkeling with vibrant marine life, paddleboarding over coral gardens, and basking on pristine white-sand beaches.
73
- I’d explore lush rainforests, hidden waterfalls, and the rich Polynesian culture through traditional dance, music, and cuisine.
74
- Evenings would be filled with romantic beachside dinners under the stars, with the soothing sound of waves as the perfect backdrop."""
75
-
76
- output = client.extract_structured_data(template=template, input_text=input_text)
77
- print(output)
78
-
79
- # Can also work with files, replace the path with your own
80
- # from pathlib import Path
81
- # output = client.extract(template=template, input_file="file.ppt")
45
+ input_file_path = Path("to", "file.pdf")
46
+ response = client.extract_structured_data(
47
+ template=template,
48
+ input_file=input_file_path,
49
+ )
50
+ print(response.result)
82
51
  ```
83
52
 
84
53
  ```json
@@ -86,7 +55,7 @@ print(output)
86
55
  "destination": {
87
56
  "name": "Tahiti",
88
57
  "zip_code": "98730",
89
- "country": "France"
58
+ "country": "FR"
90
59
  },
91
60
  "accommodation": "overwater bungalow in Bora Bora",
92
61
  "activities": [
@@ -95,16 +64,13 @@ print(output)
95
64
  "basking",
96
65
  "explore lush rainforests, hidden waterfalls, and the rich Polynesian culture"
97
66
  ],
98
- "duration": {
99
- "time_unit": null,
100
- "time_quantity": null
101
- }
67
+ "duration": null
102
68
  }
103
69
  ```
104
70
 
105
71
  ### Create a good template
106
72
 
107
- NuExtract uses JSON extraction templates which specify the information to retrieve and their types, which are:
73
+ NuExtract uses JSON extraction templates which specify the information to retrieve and their types:
108
74
 
109
75
  * **string**: a text, whose value can be abstract, i.e. totally free and can be deduced from calculations, reasoning, external knowledge;
110
76
  * **verbatim-string**: a purely extractive text whose value must be present in the document. Some flexibility might be allowed on the formatting, e.g. new lines and escaped characters (e.g. `\n`) in a documents might be represented with a space;
@@ -155,16 +121,26 @@ otherwise it is `None`, and `incompatibilities` identifies the affected location
155
121
 
156
122
  ### Inferring a template
157
123
 
158
- The "infer_template" method allows to quickly create a template that you can start to work with from a text description.
124
+ Template generation is asynchronous. Submit a natural-language description, poll the job status, and retrieve the generated template once complete.
159
125
 
160
126
  ```python
161
- from numind.openapi_client import TemplateRequest
162
- from pydantic import StrictStr
127
+ import time
128
+
129
+ from numind.models import TemplateRequest
163
130
 
164
131
  description = "Create a template that extracts key information from an order confirmation email. The template should be able to pull details like the order ID, customer ID, date and time of the order, status, total amount, currency, item details (product ID, quantity, and unit price), shipping address, any customer requests or delivery preferences, and the estimated delivery date."
165
- input_schema = client.post_api_infer_template(
166
- template_request=TemplateRequest(description=StrictStr(description))
167
- )
132
+ job_id = client.post_api_template_generation_jobs_text(
133
+ TemplateRequest(description=description)
134
+ ).job_id
135
+
136
+ job_status = client.get_api_jobs_jobid_status(job_id)
137
+ while job_status.completed_at is None:
138
+ time.sleep(4)
139
+ job_status = client.get_api_jobs_jobid_status(job_id)
140
+ if job_status.status != "completed":
141
+ raise RuntimeError(f"Template generation failed with status {job_status.status}")
142
+
143
+ template = client.get_api_template_generation_jobs_templatejobid(job_id).result
168
144
  ```
169
145
 
170
146
  ### Create a project
@@ -172,15 +148,16 @@ input_schema = client.post_api_infer_template(
172
148
  A project allows to define an information extraction task from a template and examples.
173
149
 
174
150
  ```python
175
- from numind.openapi_client import CreateProjectRequest
151
+ from numind.models import CreateStructuredProjectRequest
176
152
 
177
153
  project_id = client.post_api_structured_extraction(
178
- CreateProjectRequest(
154
+ CreateStructuredProjectRequest(
179
155
  name="vacation",
180
156
  description="Extraction of locations and activities",
181
157
  template=template,
158
+ instructions="",
182
159
  )
183
- )
160
+ ).id
184
161
  ```
185
162
 
186
163
  The `project_id` can also be found in the "API" tab of a project on the NuExtract website.
@@ -195,8 +172,7 @@ example_1_input = "This is a text example"
195
172
  example_1_expected_output = {
196
173
  "destination": {"name": None, "zip_code": None, "country": None}
197
174
  }
198
- with Path("example_2.odt").open("rb") as file: # read bytes
199
- example_2_input = file.read()
175
+ example_2_input = Path("example_2.odt")
200
176
  example_2_expected_output = {
201
177
  "destination": {"name": None, "zip_code": None, "country": None}
202
178
  }
@@ -209,34 +185,21 @@ examples = [
209
185
  client.add_examples_to_structured_extraction_project(project_id, examples)
210
186
  ```
211
187
 
212
- ### Extract structured information from text
213
-
214
- ```python
215
- output_schema = client.extract_structured_data(project_id, input_text=input_text)
216
- ```
217
-
218
- ### Extract structured information from a file
219
-
220
- ```python
221
- from pathlib import Path
222
-
223
- file_path = Path("document.odt")
224
- with file_path.open("rb") as file:
225
- input_file = file.read()
226
- output_schema = client.extract(project_id, input_file=input_file)
227
- ```
228
-
229
- ### NuMarkdown: Convert a document to a RAG-ready Markdown
188
+ ### Convert a document to a RAG-ready Markdown
230
189
 
231
190
  ```python
232
191
  from pathlib import Path
233
192
 
234
193
  file_path = Path("document.pdf")
235
- with file_path.open("rb") as file:
236
- input_file = file.read()
237
- markdown = client.extract_content(input_file)
194
+ response = client.extract_content(file_path, job_status_polling_delay=2.0)
195
+ print(response.result)
238
196
  ```
239
197
 
198
+ `extract_structured_data` and `extract_content` poll job status every four seconds by
199
+ default. Use `job_status_polling_delay` to select a different interval in seconds.
200
+ Failed jobs raise `RuntimeError` by default. Set `raise_on_job_fail=False` to return a
201
+ `FailedJobStatusResponse` containing the complete job status and its failure reason.
202
+
240
203
  # Documentation
241
204
 
242
205
  ### Extracting Information from Documents
@@ -328,7 +291,7 @@ This Python package is automatically generated by the [OpenAPI Generator](https:
328
291
 
329
292
  - API version:
330
293
  - Package version: 1.0.0
331
- - Generator version: 7.24.0
294
+ - Generator version: 7.25.0
332
295
  - Build package: org.openapitools.codegen.languages.PythonClientCodegen
333
296
 
334
297
  ### Documentation for API Endpoints
@@ -360,9 +323,7 @@ Class | Method | HTTP request | Description
360
323
  *FilesApi* | [**post_api_files_fileid_convert_to_document**](docs/FilesApi.md#post_api_files_fileid_convert_to_document) | **POST** /api/files/{fileId}/convert-to-document |
361
324
  *InferenceApi* | [**post_api_content_extraction_contentprojectid_jobs_document_documentid**](docs/InferenceApi.md#post_api_content_extraction_contentprojectid_jobs_document_documentid) | **POST** /api/content-extraction/{contentProjectId}/jobs/document/{documentId} |
362
325
  *InferenceApi* | [**post_api_structured_extraction_structuredprojectid_jobs_document_documentid**](docs/InferenceApi.md#post_api_structured_extraction_structuredprojectid_jobs_document_documentid) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/document/{documentId} |
363
- *InferenceApi* | [**post_api_structured_extraction_structuredprojectid_jobs_text**](docs/InferenceApi.md#post_api_structured_extraction_structuredprojectid_jobs_text) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/text |
364
326
  *InferenceApi* | [**post_api_template_generation_jobs_document_documentid**](docs/InferenceApi.md#post_api_template_generation_jobs_document_documentid) | **POST** /api/template-generation/jobs/document/{documentId} |
365
- *InferenceApi* | [**post_api_template_generation_jobs_text**](docs/InferenceApi.md#post_api_template_generation_jobs_text) | **POST** /api/template-generation/jobs/text |
366
327
  *JobsApi* | [**get_api_jobs**](docs/JobsApi.md#get_api_jobs) | **GET** /api/jobs |
367
328
  *JobsApi* | [**get_api_jobs_jobid_status**](docs/JobsApi.md#get_api_jobs_jobid_status) | **GET** /api/jobs/{jobId}/status |
368
329
  *JobsApi* | [**get_api_jobs_jobid_stream**](docs/JobsApi.md#get_api_jobs_jobid_stream) | **GET** /api/jobs/{jobId}/stream |
@@ -370,7 +331,9 @@ Class | Method | HTTP request | Description
370
331
  *ProjectImportExportApi* | [**get_api_extraction_projectkind_projectid_export**](docs/ProjectImportExportApi.md#get_api_extraction_projectkind_projectid_export) | **GET** /api/extraction/{projectKind}/{projectId}/export |
371
332
  *ProjectImportExportApi* | [**post_api_extraction_import**](docs/ProjectImportExportApi.md#post_api_extraction_import) | **POST** /api/extraction/import |
372
333
  *StructuredDataExtractionApi* | [**get_api_structured_extraction_jobs_structuredextractionjobid**](docs/StructuredDataExtractionApi.md#get_api_structured_extraction_jobs_structuredextractionjobid) | **GET** /api/structured-extraction/jobs/{structuredExtractionJobId} |
334
+ *StructuredDataExtractionApi* | [**post_api_structured_extraction_jobs**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_jobs) | **POST** /api/structured-extraction/jobs |
373
335
  *StructuredDataExtractionApi* | [**post_api_structured_extraction_structuredprojectid_jobs**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_structuredprojectid_jobs) | **POST** /api/structured-extraction/{structuredProjectId}/jobs |
336
+ *StructuredDataExtractionApi* | [**post_api_structured_extraction_structuredprojectid_jobs_text**](docs/StructuredDataExtractionApi.md#post_api_structured_extraction_structuredprojectid_jobs_text) | **POST** /api/structured-extraction/{structuredProjectId}/jobs/text |
374
337
  *StructuredExtractionExamplesApi* | [**delete_api_structured_extraction_structuredprojectid_examples_structuredexampleid**](docs/StructuredExtractionExamplesApi.md#delete_api_structured_extraction_structuredprojectid_examples_structuredexampleid) | **DELETE** /api/structured-extraction/{structuredProjectId}/examples/{structuredExampleId} |
375
338
  *StructuredExtractionExamplesApi* | [**get_api_structured_extraction_structuredprojectid_examples**](docs/StructuredExtractionExamplesApi.md#get_api_structured_extraction_structuredprojectid_examples) | **GET** /api/structured-extraction/{structuredProjectId}/examples |
376
339
  *StructuredExtractionExamplesApi* | [**get_api_structured_extraction_structuredprojectid_examples_structuredexampleid**](docs/StructuredExtractionExamplesApi.md#get_api_structured_extraction_structuredprojectid_examples_structuredexampleid) | **GET** /api/structured-extraction/{structuredProjectId}/examples/{structuredExampleId} |
@@ -391,6 +354,7 @@ Class | Method | HTTP request | Description
391
354
  *StructuredExtractionProjectManagementApi* | [**post_api_structured_extraction_structuredprojectid_unshare**](docs/StructuredExtractionProjectManagementApi.md#post_api_structured_extraction_structuredprojectid_unshare) | **POST** /api/structured-extraction/{structuredProjectId}/unshare |
392
355
  *TemplateGenerationApi* | [**get_api_template_generation_jobs_templatejobid**](docs/TemplateGenerationApi.md#get_api_template_generation_jobs_templatejobid) | **GET** /api/template-generation/jobs/{templateJobId} |
393
356
  *TemplateGenerationApi* | [**post_api_template_generation_jobs**](docs/TemplateGenerationApi.md#post_api_template_generation_jobs) | **POST** /api/template-generation/jobs |
357
+ *TemplateGenerationApi* | [**post_api_template_generation_jobs_text**](docs/TemplateGenerationApi.md#post_api_template_generation_jobs_text) | **POST** /api/template-generation/jobs/text |
394
358
 
395
359
 
396
360
  ### Documentation For Models