mindee 4.6.0 → 4.7.0.pre.rc2
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -0
- data/README.md +21 -222
- data/docs/code_samples/default_v2.txt +28 -0
- data/lib/mindee/client.rb +11 -30
- data/lib/mindee/client_v2.rb +109 -0
- data/lib/mindee/errors/mindee_http_error_v2.rb +26 -0
- data/lib/mindee/errors/mindee_input_error.rb +1 -1
- data/lib/mindee/errors.rb +1 -0
- data/lib/mindee/geometry/point.rb +2 -2
- data/lib/mindee/geometry/quadrilateral.rb +4 -4
- data/lib/mindee/geometry/utils.rb +1 -0
- data/lib/mindee/http/api_settings_v2.rb +61 -0
- data/lib/mindee/http/endpoint.rb +12 -6
- data/lib/mindee/http/http_error_handler.rb +17 -4
- data/lib/mindee/http/mindee_api_v2.rb +148 -0
- data/lib/mindee/http/response_validation.rb +20 -1
- data/lib/mindee/http/workflow_endpoint.rb +2 -2
- data/lib/mindee/http.rb +2 -0
- data/lib/mindee/image/extracted_image.rb +1 -1
- data/lib/mindee/image/image_extractor.rb +12 -15
- data/lib/mindee/input/inference_parameters.rb +116 -0
- data/lib/mindee/input/local_response.rb +10 -1
- data/lib/mindee/input/polling_options.rb +26 -0
- data/lib/mindee/input/sources/base64_input_source.rb +2 -2
- data/lib/mindee/input/sources/local_input_source.rb +49 -30
- data/lib/mindee/input.rb +2 -0
- data/lib/mindee/page_options.rb +24 -0
- data/lib/mindee/parsing/common/api_request.rb +2 -2
- data/lib/mindee/parsing/common/api_response.rb +4 -0
- data/lib/mindee/parsing/common/execution.rb +1 -1
- data/lib/mindee/parsing/common/extras/extras.rb +2 -2
- data/lib/mindee/parsing/common/extras/rag_extra.rb +2 -0
- data/lib/mindee/parsing/common/ocr/ocr.rb +4 -6
- data/lib/mindee/parsing/common/orientation.rb +2 -2
- data/lib/mindee/parsing/common/product.rb +6 -1
- data/lib/mindee/parsing/standard/amount_field.rb +2 -2
- data/lib/mindee/parsing/standard/feature_field.rb +1 -1
- data/lib/mindee/parsing/standard/tax_field.rb +1 -1
- data/lib/mindee/parsing/universal/universal_list_field.rb +2 -2
- data/lib/mindee/parsing/universal/universal_object_field.rb +7 -4
- data/lib/mindee/parsing/v2/common_response.rb +18 -0
- data/lib/mindee/parsing/v2/error_response.rb +36 -0
- data/lib/mindee/parsing/v2/field/base_field.rb +60 -0
- data/lib/mindee/parsing/v2/field/field_confidence.rb +91 -0
- data/lib/mindee/parsing/v2/field/field_location.rb +36 -0
- data/lib/mindee/parsing/v2/field/inference_fields.rb +96 -0
- data/lib/mindee/parsing/v2/field/list_field.rb +88 -0
- data/lib/mindee/parsing/v2/field/object_field.rb +102 -0
- data/lib/mindee/parsing/v2/field/simple_field.rb +55 -0
- data/lib/mindee/parsing/v2/field.rb +9 -0
- data/lib/mindee/parsing/v2/inference.rb +50 -0
- data/lib/mindee/parsing/v2/inference_file.rb +38 -0
- data/lib/mindee/parsing/v2/inference_model.rb +18 -0
- data/lib/mindee/parsing/v2/inference_response.rb +30 -0
- data/lib/mindee/parsing/v2/inference_result.rb +49 -0
- data/lib/mindee/parsing/v2/inference_result_options.rb +21 -0
- data/lib/mindee/parsing/v2/job.rb +86 -0
- data/lib/mindee/parsing/v2/job_response.rb +30 -0
- data/lib/mindee/parsing/v2/job_webhook.rb +60 -0
- data/lib/mindee/parsing/v2/raw_text.rb +21 -0
- data/lib/mindee/parsing/v2.rb +15 -0
- data/lib/mindee/pdf/extracted_pdf.rb +5 -3
- data/lib/mindee/pdf/pdf_extractor.rb +11 -7
- data/lib/mindee/pdf/pdf_processor.rb +6 -6
- data/lib/mindee/pdf/pdf_tools.rb +6 -4
- data/lib/mindee/product/universal/universal_prediction.rb +4 -4
- data/lib/mindee/version.rb +2 -2
- data/lib/mindee.rb +6 -0
- data/mindee.gemspec +1 -1
- data/sig/custom/mini_magick.rbs +14 -7
- data/sig/custom/net_http.rbs +4 -4
- data/sig/custom/origami.rbs +9 -4
- data/sig/mindee/client.rbs +14 -19
- data/sig/mindee/client_v2.rbs +17 -0
- data/sig/mindee/errors/mindee_http_error.rbs +6 -5
- data/sig/mindee/errors/mindee_http_error_v2.rbs +12 -0
- data/sig/mindee/errors/mindee_input_error.rbs +3 -2
- data/sig/mindee/geometry/min_max.rbs +4 -3
- data/sig/mindee/geometry/point.rbs +5 -6
- data/sig/mindee/geometry/polygon.rbs +3 -3
- data/sig/mindee/geometry/quadrilateral.rbs +5 -8
- data/sig/mindee/geometry/utils.rbs +8 -8
- data/sig/mindee/http/api_settings_v2.rbs +23 -0
- data/sig/mindee/http/endpoint.rbs +12 -11
- data/sig/mindee/http/http_error_handler.rbs +8 -3
- data/sig/mindee/http/mindee_api_v2.rbs +18 -0
- data/sig/mindee/http/response_validation.rbs +1 -0
- data/sig/mindee/http/workflow_endpoint.rbs +1 -1
- data/sig/mindee/image/extracted_image.rbs +2 -2
- data/sig/mindee/image/image_compressor.rbs +1 -1
- data/sig/mindee/image/image_extractor.rbs +5 -5
- data/sig/mindee/image/image_utils.rbs +10 -10
- data/sig/mindee/input/inference_parameters.rbs +30 -0
- data/sig/mindee/input/local_response.rbs +6 -5
- data/sig/mindee/input/polling_options.rbs +12 -0
- data/sig/mindee/input/sources/base64_input_source.rbs +1 -1
- data/sig/mindee/input/sources/local_input_source.rbs +14 -7
- data/sig/mindee/input/sources/url_input_source.rbs +1 -1
- data/sig/mindee/logging/logger.rbs +2 -0
- data/sig/mindee/page_options.rbs +11 -0
- data/sig/mindee/parsing/common/api_request.rbs +6 -6
- data/sig/mindee/parsing/common/api_response.rbs +2 -2
- data/sig/mindee/parsing/common/document.rbs +10 -10
- data/sig/mindee/parsing/common/execution.rbs +15 -14
- data/sig/mindee/parsing/common/execution_file.rbs +3 -3
- data/sig/mindee/parsing/common/extras/cropper_extra.rbs +3 -2
- data/sig/mindee/parsing/common/extras/extras.rbs +6 -5
- data/sig/mindee/parsing/common/extras/full_text_ocr_extra.rbs +2 -1
- data/sig/mindee/parsing/common/inference.rbs +16 -9
- data/sig/mindee/parsing/common/job.rbs +2 -2
- data/sig/mindee/parsing/common/ocr/mvision_v1.rbs +2 -2
- data/sig/mindee/parsing/common/ocr/ocr.rbs +22 -20
- data/sig/mindee/parsing/common/orientation.rbs +4 -3
- data/sig/mindee/parsing/common/page.rbs +6 -5
- data/sig/mindee/parsing/common/product.rbs +4 -4
- data/sig/mindee/parsing/common/workflow_response.rbs +8 -4
- data/sig/mindee/parsing/standard/abstract_field.rbs +1 -1
- data/sig/mindee/parsing/standard/address_field.rbs +1 -1
- data/sig/mindee/parsing/standard/amount_field.rbs +6 -4
- data/sig/mindee/parsing/standard/base_field.rbs +1 -1
- data/sig/mindee/parsing/standard/boolean_field.rbs +1 -1
- data/sig/mindee/parsing/standard/company_registration_field.rbs +3 -2
- data/sig/mindee/parsing/standard/date_field.rbs +6 -6
- data/sig/mindee/parsing/standard/locale_field.rbs +1 -1
- data/sig/mindee/parsing/standard/payment_details_field.rbs +7 -6
- data/sig/mindee/parsing/standard/position_field.rbs +2 -2
- data/sig/mindee/parsing/standard/string_field.rbs +1 -1
- data/sig/mindee/parsing/standard/tax_field.rbs +8 -7
- data/sig/mindee/parsing/universal/universal_list_field.rbs +4 -5
- data/sig/mindee/parsing/universal/universal_object_field.rbs +17 -11
- data/sig/mindee/parsing/v2/common_response.rbs +11 -0
- data/sig/mindee/parsing/v2/error_response.rbs +16 -0
- data/sig/mindee/parsing/v2/field/base_field.rbs +17 -0
- data/sig/mindee/parsing/v2/field/field_confidence.rbs +27 -0
- data/sig/mindee/parsing/v2/field/field_location.rbs +16 -0
- data/sig/mindee/parsing/v2/field/inference_fields.rbs +19 -0
- data/sig/mindee/parsing/v2/field/list_field.rbs +21 -0
- data/sig/mindee/parsing/v2/field/object_field.rbs +21 -0
- data/sig/mindee/parsing/v2/field/simple_field.rbs +16 -0
- data/sig/mindee/parsing/v2/inference.rbs +16 -0
- data/sig/mindee/parsing/v2/inference_file.rbs +15 -0
- data/sig/mindee/parsing/v2/inference_model.rbs +11 -0
- data/sig/mindee/parsing/v2/inference_response.rbs +12 -0
- data/sig/mindee/parsing/v2/inference_result.rbs +13 -0
- data/sig/mindee/parsing/v2/inference_result_options.rbs +11 -0
- data/sig/mindee/parsing/v2/job.rbs +22 -0
- data/sig/mindee/parsing/v2/job_response.rbs +12 -0
- data/sig/mindee/parsing/v2/job_webhook.rbs +17 -0
- data/sig/mindee/parsing/v2/raw_text.rbs +12 -0
- data/sig/mindee/pdf/extracted_pdf.rbs +6 -6
- data/sig/mindee/pdf/pdf_compressor.rbs +4 -4
- data/sig/mindee/pdf/pdf_extractor.rbs +8 -7
- data/sig/mindee/pdf/pdf_processor.rbs +4 -4
- data/sig/mindee/pdf/pdf_tools.rbs +22 -16
- data/sig/mindee/product/barcode_reader/barcode_reader_v1.rbs +1 -1
- data/sig/mindee/product/barcode_reader/barcode_reader_v1_document.rbs +1 -1
- data/sig/mindee/product/barcode_reader/barcode_reader_v1_page.rbs +2 -2
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1.rbs +1 -1
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier.rbs +2 -2
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_carrier_item.rbs +3 -3
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_consignee.rbs +2 -2
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_document.rbs +1 -1
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_notify_party.rbs +2 -2
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_page.rbs +2 -2
- data/sig/mindee/product/bill_of_lading/bill_of_lading_v1_shipper.rbs +2 -2
- data/sig/mindee/product/business_card/business_card_v1.rbs +1 -1
- data/sig/mindee/product/business_card/business_card_v1_document.rbs +1 -1
- data/sig/mindee/product/business_card/business_card_v1_page.rbs +2 -2
- data/sig/mindee/product/cropper/cropper_v1.rbs +1 -1
- data/sig/mindee/product/cropper/cropper_v1_document.rbs +1 -1
- data/sig/mindee/product/cropper/cropper_v1_page.rbs +2 -2
- data/sig/mindee/product/delivery_note/delivery_note_v1.rbs +1 -1
- data/sig/mindee/product/delivery_note/delivery_note_v1_document.rbs +1 -1
- data/sig/mindee/product/delivery_note/delivery_note_v1_page.rbs +2 -2
- data/sig/mindee/product/driver_license/driver_license_v1.rbs +1 -1
- data/sig/mindee/product/driver_license/driver_license_v1_document.rbs +1 -1
- data/sig/mindee/product/driver_license/driver_license_v1_page.rbs +2 -2
- data/sig/mindee/product/financial_document/financial_document_v1.rbs +1 -1
- data/sig/mindee/product/financial_document/financial_document_v1_document.rbs +1 -1
- data/sig/mindee/product/financial_document/financial_document_v1_line_item.rbs +3 -3
- data/sig/mindee/product/financial_document/financial_document_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1.rbs +1 -1
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_document.rbs +1 -1
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2.rbs +1 -1
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_bban.rbs +2 -2
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_document.rbs +1 -1
- data/sig/mindee/product/fr/bank_account_details/bank_account_details_v2_page.rbs +2 -2
- data/sig/mindee/product/fr/bank_statement/bank_statement_v2.rbs +1 -1
- data/sig/mindee/product/fr/bank_statement/bank_statement_v2_document.rbs +1 -1
- data/sig/mindee/product/fr/bank_statement/bank_statement_v2_page.rbs +2 -2
- data/sig/mindee/product/fr/bank_statement/bank_statement_v2_transaction.rbs +3 -3
- data/sig/mindee/product/fr/carte_grise/carte_grise_v1.rbs +1 -1
- data/sig/mindee/product/fr/carte_grise/carte_grise_v1_document.rbs +1 -1
- data/sig/mindee/product/fr/carte_grise/carte_grise_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1.rbs +1 -1
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_document.rbs +1 -1
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_consumer.rbs +2 -2
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_supplier.rbs +2 -2
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_energy_usage.rbs +3 -3
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_meter_detail.rbs +2 -2
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_subscription.rbs +3 -3
- data/sig/mindee/product/fr/energy_bill/energy_bill_v1_taxes_and_contribution.rbs +3 -3
- data/sig/mindee/product/fr/health_card/health_card_v1.rbs +1 -1
- data/sig/mindee/product/fr/health_card/health_card_v1_document.rbs +1 -1
- data/sig/mindee/product/fr/health_card/health_card_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/id_card/id_card_v1.rbs +1 -1
- data/sig/mindee/product/fr/id_card/id_card_v1_document.rbs +1 -1
- data/sig/mindee/product/fr/id_card/id_card_v1_page.rbs +2 -2
- data/sig/mindee/product/fr/id_card/id_card_v2.rbs +1 -1
- data/sig/mindee/product/fr/id_card/id_card_v2_document.rbs +1 -1
- data/sig/mindee/product/fr/id_card/id_card_v2_page.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2.rbs +1 -1
- data/sig/mindee/product/fr/payslip/payslip_v2_bank_account_detail.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_document.rbs +1 -1
- data/sig/mindee/product/fr/payslip/payslip_v2_employee.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_employer.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_employment.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_page.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_pay_detail.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_pay_period.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_pto.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v2_salary_detail.rbs +3 -3
- data/sig/mindee/product/fr/payslip/payslip_v3.rbs +1 -1
- data/sig/mindee/product/fr/payslip/payslip_v3_bank_account_detail.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_document.rbs +1 -1
- data/sig/mindee/product/fr/payslip/payslip_v3_employee.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_employer.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_employment.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_page.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_paid_time_off.rbs +3 -3
- data/sig/mindee/product/fr/payslip/payslip_v3_pay_detail.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_pay_period.rbs +2 -2
- data/sig/mindee/product/fr/payslip/payslip_v3_salary_detail.rbs +3 -3
- data/sig/mindee/product/ind/indian_passport/indian_passport_v1.rbs +1 -1
- data/sig/mindee/product/ind/indian_passport/indian_passport_v1_document.rbs +1 -1
- data/sig/mindee/product/ind/indian_passport/indian_passport_v1_page.rbs +2 -2
- data/sig/mindee/product/international_id/international_id_v2.rbs +1 -1
- data/sig/mindee/product/international_id/international_id_v2_document.rbs +1 -1
- data/sig/mindee/product/international_id/international_id_v2_page.rbs +2 -2
- data/sig/mindee/product/invoice/invoice_v4.rbs +1 -1
- data/sig/mindee/product/invoice/invoice_v4_document.rbs +1 -1
- data/sig/mindee/product/invoice/invoice_v4_line_item.rbs +3 -3
- data/sig/mindee/product/invoice/invoice_v4_page.rbs +2 -2
- data/sig/mindee/product/invoice_splitter/invoice_splitter_v1.rbs +1 -1
- data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_document.rbs +1 -1
- data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_invoice_page_group.rbs +3 -3
- data/sig/mindee/product/invoice_splitter/invoice_splitter_v1_page.rbs +2 -2
- data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1.rbs +1 -1
- data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_document.rbs +1 -1
- data/sig/mindee/product/multi_receipts_detector/multi_receipts_detector_v1_page.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1.rbs +1 -1
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_added_sugar.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_calorie.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_cholesterol.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_dietary_fiber.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_document.rbs +1 -1
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_nutrient.rbs +3 -3
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_page.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_protein.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_saturated_fat.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_serving_size.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_sodium.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_carbohydrate.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_fat.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_total_sugar.rbs +2 -2
- data/sig/mindee/product/nutrition_facts_label/nutrition_facts_label_v1_trans_fat.rbs +2 -2
- data/sig/mindee/product/passport/passport_v1.rbs +1 -1
- data/sig/mindee/product/passport/passport_v1_document.rbs +1 -1
- data/sig/mindee/product/passport/passport_v1_page.rbs +2 -2
- data/sig/mindee/product/receipt/receipt_v5.rbs +1 -1
- data/sig/mindee/product/receipt/receipt_v5_document.rbs +1 -1
- data/sig/mindee/product/receipt/receipt_v5_line_item.rbs +3 -3
- data/sig/mindee/product/receipt/receipt_v5_page.rbs +2 -2
- data/sig/mindee/product/resume/resume_v1.rbs +1 -1
- data/sig/mindee/product/resume/resume_v1_certificate.rbs +3 -3
- data/sig/mindee/product/resume/resume_v1_document.rbs +1 -1
- data/sig/mindee/product/resume/resume_v1_education.rbs +3 -3
- data/sig/mindee/product/resume/resume_v1_language.rbs +3 -3
- data/sig/mindee/product/resume/resume_v1_page.rbs +2 -2
- data/sig/mindee/product/resume/resume_v1_professional_experience.rbs +3 -3
- data/sig/mindee/product/resume/resume_v1_social_networks_url.rbs +3 -3
- data/sig/mindee/product/universal/universal.rbs +5 -5
- data/sig/mindee/product/universal/universal_document.rbs +1 -1
- data/sig/mindee/product/universal/universal_page.rbs +2 -2
- data/sig/mindee/product/universal/universal_prediction.rbs +5 -5
- data/sig/mindee/product/us/bank_check/bank_check_v1.rbs +1 -1
- data/sig/mindee/product/us/bank_check/bank_check_v1_document.rbs +1 -1
- data/sig/mindee/product/us/bank_check/bank_check_v1_page.rbs +2 -2
- data/sig/mindee/product/us/healthcare_card/healthcare_card_v1.rbs +1 -1
- data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_copay.rbs +3 -3
- data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_document.rbs +1 -1
- data/sig/mindee/product/us/healthcare_card/healthcare_card_v1_page.rbs +2 -2
- data/sig/mindee/product/us/us_mail/us_mail_v2.rbs +1 -1
- data/sig/mindee/product/us/us_mail/us_mail_v2_document.rbs +1 -1
- data/sig/mindee/product/us/us_mail/us_mail_v2_page.rbs +2 -2
- data/sig/mindee/product/us/us_mail/us_mail_v2_recipient_address.rbs +3 -3
- data/sig/mindee/product/us/us_mail/us_mail_v2_sender_address.rbs +2 -2
- data/sig/mindee/product/us/us_mail/us_mail_v3.rbs +1 -1
- data/sig/mindee/product/us/us_mail/us_mail_v3_document.rbs +1 -1
- data/sig/mindee/product/us/us_mail/us_mail_v3_page.rbs +2 -2
- data/sig/mindee/product/us/us_mail/us_mail_v3_recipient_address.rbs +3 -3
- data/sig/mindee/product/us/us_mail/us_mail_v3_sender_address.rbs +2 -2
- data/sig/mindee/product/us/w9/w9_v1.rbs +1 -1
- data/sig/mindee/product/us/w9/w9_v1_document.rbs +1 -1
- data/sig/mindee/product/us/w9/w9_v1_page.rbs +2 -2
- data/sig/mindee/version.rbs +2 -2
- metadata +61 -6
data/lib/mindee/http/endpoint.rb
CHANGED
@@ -66,6 +66,9 @@ module Mindee
|
|
66
66
|
|
67
67
|
ResponseValidation.clean_request!(response)
|
68
68
|
end
|
69
|
+
|
70
|
+
raise Errors::MindeeError, 'Could not resolve server response.' if response.nil?
|
71
|
+
|
69
72
|
error = ErrorHandler.handle_error(@url_name, response)
|
70
73
|
raise error
|
71
74
|
end
|
@@ -84,8 +87,9 @@ module Mindee
|
|
84
87
|
ResponseValidation.clean_request!(response)
|
85
88
|
end
|
86
89
|
|
87
|
-
|
88
|
-
|
90
|
+
raise Errors::MindeeError, 'Could not resolve server response.' if response.nil?
|
91
|
+
|
92
|
+
raise ErrorHandler.handle_error(@url_name, response)
|
89
93
|
end
|
90
94
|
|
91
95
|
# Calls the parsed async doc.
|
@@ -110,7 +114,7 @@ module Mindee
|
|
110
114
|
def predict_req_post(input_source, opts)
|
111
115
|
uri = URI("#{@url_root}/predict")
|
112
116
|
|
113
|
-
params = {} # : Hash[
|
117
|
+
params = {} # : Hash[String | Symbol, untyped]
|
114
118
|
params[:cropper] = 'true' if opts.cropper
|
115
119
|
params[:full_text_ocr] = 'true' if opts.full_text
|
116
120
|
uri.query = URI.encode_www_form(params)
|
@@ -123,7 +127,7 @@ module Mindee
|
|
123
127
|
form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource)
|
124
128
|
[['document', input_source.url]] # : Array[untyped]
|
125
129
|
else
|
126
|
-
[input_source.read_contents(close: opts.close_file)] # : Array[untyped]
|
130
|
+
[['document', *input_source.read_contents(close: opts.close_file)]] # : Array[untyped]
|
127
131
|
end
|
128
132
|
form_data.push ['include_mvision', 'true'] if opts.all_words
|
129
133
|
|
@@ -146,7 +150,7 @@ module Mindee
|
|
146
150
|
URI("#{@url_root}/predict_async")
|
147
151
|
end
|
148
152
|
|
149
|
-
params = {} # : Hash[
|
153
|
+
params = {} # : Hash[String | Symbol, untyped]
|
150
154
|
params[:cropper] = 'true' if opts.cropper
|
151
155
|
params[:full_text_ocr] = 'true' if opts.full_text
|
152
156
|
params[:rag] = 'true' if opts.rag
|
@@ -160,7 +164,7 @@ module Mindee
|
|
160
164
|
form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource)
|
161
165
|
[['document', input_source.url]] # : Array[untyped]
|
162
166
|
else
|
163
|
-
[input_source.read_contents(close: opts.close_file)] # : Array[untyped]
|
167
|
+
[['document', *input_source.read_contents(close: opts.close_file)]] # : Array[untyped]
|
164
168
|
end
|
165
169
|
form_data.push ['include_mvision', 'true'] if opts.all_words
|
166
170
|
|
@@ -189,6 +193,8 @@ module Mindee
|
|
189
193
|
http.request(req)
|
190
194
|
end
|
191
195
|
|
196
|
+
raise Errors::MindeeError, 'Could not resolve server response.' if response.nil?
|
197
|
+
|
192
198
|
if response.code.to_i > 299 && response.code.to_i < 400
|
193
199
|
req = Net::HTTP::Get.new(response['location'], headers)
|
194
200
|
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @request_timeout) do |http|
|
@@ -65,7 +65,7 @@ module Mindee
|
|
65
65
|
end
|
66
66
|
|
67
67
|
end
|
68
|
-
error_obj
|
68
|
+
error_obj
|
69
69
|
end
|
70
70
|
|
71
71
|
# Creates an appropriate HTTP error exception, based on retrieved http error code
|
@@ -81,11 +81,24 @@ module Mindee
|
|
81
81
|
error_obj = create_error_obj(parsed_hash)
|
82
82
|
case code
|
83
83
|
when 400..499
|
84
|
-
Errors::MindeeHTTPClientError.new(error_obj, url, code)
|
84
|
+
Errors::MindeeHTTPClientError.new(error_obj || {}, url, code)
|
85
85
|
when 500..599
|
86
|
-
Errors::MindeeHTTPServerError.new(error_obj, url, code)
|
86
|
+
Errors::MindeeHTTPServerError.new(error_obj || {}, url, code)
|
87
87
|
else
|
88
|
-
Errors::MindeeHTTPError.new(error_obj, url, code)
|
88
|
+
Errors::MindeeHTTPError.new(error_obj || {}, url, code)
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
# Creates an appropriate HTTP error exception for a V2 API response, based on retrieved http error code.
|
93
|
+
# @param hashed_response [Hash] dictionary response retrieved by the server
|
94
|
+
def generate_v2_error(hashed_response)
|
95
|
+
code = hashed_response[:code].to_i
|
96
|
+
if hashed_response.key?(:status)
|
97
|
+
Errors::MindeeHTTPErrorV2.new(hashed_response.transform_keys(&:to_s))
|
98
|
+
elsif code < 200 || code > 399
|
99
|
+
Errors::MindeeHTTPErrorV2.new({ 'status' => code, 'detail' => 'No details available.' })
|
100
|
+
else
|
101
|
+
Errors::MindeeHTTPErrorV2.new({ 'status' => -1, 'detail' => 'Unknown Error.' })
|
89
102
|
end
|
90
103
|
end
|
91
104
|
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'api_settings_v2'
|
4
|
+
require_relative '../input'
|
5
|
+
require_relative '../errors'
|
6
|
+
require_relative '../parsing/v2'
|
7
|
+
|
8
|
+
module Mindee
|
9
|
+
module HTTP
|
10
|
+
# API client for version 2.
|
11
|
+
class MindeeApiV2
|
12
|
+
# @return [ApiSettingsV2]
|
13
|
+
attr_reader :settings
|
14
|
+
|
15
|
+
# @param api_key [String, nil]
|
16
|
+
def initialize(api_key: nil)
|
17
|
+
@settings = ApiSettingsV2.new(api_key: api_key)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Sends a file to the inference queue.
|
21
|
+
#
|
22
|
+
# @param input_source [Input::Source::LocalInputSource, Input::Source::URLInputSource]
|
23
|
+
# @param params [Input::InferenceParameters]
|
24
|
+
# @return [Mindee::Parsing::V2::JobResponse]
|
25
|
+
# @raise [Mindee::Errors::MindeeHttpErrorV2]
|
26
|
+
def req_post_inference_enqueue(input_source, params)
|
27
|
+
@settings.check_api_key
|
28
|
+
response = enqueue(
|
29
|
+
input_source,
|
30
|
+
params
|
31
|
+
)
|
32
|
+
Parsing::V2::JobResponse.new(process_response(response))
|
33
|
+
end
|
34
|
+
|
35
|
+
# Retrieves a queued inference.
|
36
|
+
#
|
37
|
+
# @param inference_id [String]
|
38
|
+
# @return [Mindee::Parsing::V2::InferenceResponse]
|
39
|
+
def req_get_inference(inference_id)
|
40
|
+
@settings.check_api_key
|
41
|
+
response = inference_result_req_get(
|
42
|
+
inference_id
|
43
|
+
)
|
44
|
+
Parsing::V2::InferenceResponse.new(process_response(response))
|
45
|
+
end
|
46
|
+
|
47
|
+
# Retrieves a queued job.
|
48
|
+
#
|
49
|
+
# @param job_id [String]
|
50
|
+
# @return [Mindee::Parsing::V2::JobResponse]
|
51
|
+
def req_get_job(job_id)
|
52
|
+
@settings.check_api_key
|
53
|
+
response = inference_job_req_get(
|
54
|
+
job_id
|
55
|
+
)
|
56
|
+
Parsing::V2::JobResponse.new(process_response(response))
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
# Converts an HTTP response to a parsed response object.
|
62
|
+
#
|
63
|
+
# @param response [Net::HTTPResponse, nil]
|
64
|
+
# @return [Hash]
|
65
|
+
# @raise Throws if the server returned an error.
|
66
|
+
def process_response(response)
|
67
|
+
if !response.nil? && response.respond_to?(:body) && ResponseValidation.valid_v2_response?(response)
|
68
|
+
return JSON.parse(response.body, object_class: Hash)
|
69
|
+
end
|
70
|
+
|
71
|
+
response_body = if response.nil? || !response.respond_to?(:body)
|
72
|
+
'{ "status": -1,
|
73
|
+
"detail": "Empty server response." }'
|
74
|
+
else
|
75
|
+
response.body
|
76
|
+
end
|
77
|
+
raise ErrorHandler.generate_v2_error(JSON.parse(response_body).transform_keys(&:to_sym))
|
78
|
+
end
|
79
|
+
|
80
|
+
# Polls a queue for either a result or a job.
|
81
|
+
# @param url [String] URL, passed as a string.
|
82
|
+
# @return [Net::HTTPResponse]
|
83
|
+
def poll(url)
|
84
|
+
uri = URI(url)
|
85
|
+
headers = {
|
86
|
+
'Authorization' => @settings.api_key,
|
87
|
+
'User-Agent' => @settings.user_agent,
|
88
|
+
}
|
89
|
+
req = Net::HTTP::Get.new(uri, headers)
|
90
|
+
req['Transfer-Encoding'] = 'chunked'
|
91
|
+
|
92
|
+
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @settings.request_timeout) do |http|
|
93
|
+
return http.request(req)
|
94
|
+
end
|
95
|
+
raise Mindee::Errors::MindeeError, 'Could not resolve server response.'
|
96
|
+
end
|
97
|
+
|
98
|
+
# Polls the API for the status of a job.
|
99
|
+
#
|
100
|
+
# @param job_id [String] ID of the job.
|
101
|
+
# @return [Net::HTTPResponse]
|
102
|
+
def inference_job_req_get(job_id)
|
103
|
+
poll("#{@settings.base_url}/jobs/#{job_id}")
|
104
|
+
end
|
105
|
+
|
106
|
+
# Polls the API for the result of an inference.
|
107
|
+
#
|
108
|
+
# @param queue_id [String] ID of the queue.
|
109
|
+
# @return [Net::HTTPResponse]
|
110
|
+
def inference_result_req_get(queue_id)
|
111
|
+
poll("#{@settings.base_url}/inferences/#{queue_id}")
|
112
|
+
end
|
113
|
+
|
114
|
+
# @param input_source [Mindee::Input::Source::LocalInputSource, Mindee::Input::Source::URLInputSource]
|
115
|
+
# @param params [Input::InferenceParameters] Parse options.
|
116
|
+
# @return [Net::HTTPResponse, nil]
|
117
|
+
def enqueue(input_source, params)
|
118
|
+
uri = URI("#{@settings.base_url}/inferences/enqueue")
|
119
|
+
|
120
|
+
form_data = if input_source.is_a?(Mindee::Input::Source::URLInputSource)
|
121
|
+
[['url', input_source.url]] # : Array[untyped]
|
122
|
+
else
|
123
|
+
file_data, file_metadata = input_source.read_contents(close: params.close_file)
|
124
|
+
[['file', file_data, file_metadata]] # : Array[untyped]
|
125
|
+
end
|
126
|
+
form_data.push ['model_id', params.model_id]
|
127
|
+
form_data.push ['rag', 'true'] if params.rag
|
128
|
+
form_data.push ['file_alias', params.file_alias] if params.file_alias
|
129
|
+
unless params.webhook_ids.nil? || params.webhook_ids.empty?
|
130
|
+
form_data.push ['webhook_ids', params.webhook_ids.join(',')]
|
131
|
+
end
|
132
|
+
headers = {
|
133
|
+
'Authorization' => @settings.api_key,
|
134
|
+
'User-Agent' => @settings.user_agent,
|
135
|
+
}
|
136
|
+
req = Net::HTTP::Post.new(uri, headers)
|
137
|
+
|
138
|
+
req.set_form(form_data, 'multipart/form-data')
|
139
|
+
req['Transfer-Encoding'] = 'chunked'
|
140
|
+
|
141
|
+
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true, read_timeout: @settings.request_timeout) do |http|
|
142
|
+
return http.request(req)
|
143
|
+
end
|
144
|
+
raise Mindee::Errors::MindeeError, 'Could not resolve server response.'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -21,6 +21,25 @@ module Mindee
|
|
21
21
|
true
|
22
22
|
end
|
23
23
|
|
24
|
+
# Checks if a V2 response is valid.
|
25
|
+
# @param [Net::HTTPResponse] response
|
26
|
+
# @return [bool]
|
27
|
+
def self.valid_v2_response?(response)
|
28
|
+
return false unless valid_sync_response?(response)
|
29
|
+
|
30
|
+
hashed_response = JSON.parse(response.body, object_class: Hash)
|
31
|
+
|
32
|
+
return false if hashed_response.dig('job', 'status').to_s == 'Failed'
|
33
|
+
|
34
|
+
return false if hashed_response.dig('job',
|
35
|
+
'error') && !(hashed_response.dig('job',
|
36
|
+
'error').empty? || hashed_response.dig(
|
37
|
+
'job', 'error'
|
38
|
+
).nil?)
|
39
|
+
|
40
|
+
true
|
41
|
+
end
|
42
|
+
|
24
43
|
# Checks if the asynchronous response is valid. Also checks if it is a valid synchronous response.
|
25
44
|
# Returns true if the response is valid.
|
26
45
|
# @param [Net::HTTPResponse] response
|
@@ -52,7 +71,7 @@ module Mindee
|
|
52
71
|
end
|
53
72
|
|
54
73
|
return if !hashed_response.dig('job', 'error').empty? &&
|
55
|
-
(hashed_response.dig('job', 'status') != Mindee::Parsing::Common::JobStatus::FAILURE.to_s)
|
74
|
+
(hashed_response.dig('job', 'status').downcase != Mindee::Parsing::Common::JobStatus::FAILURE.to_s)
|
56
75
|
|
57
76
|
response.instance_variable_set(:@code, '500')
|
58
77
|
end
|
@@ -48,7 +48,7 @@ module Mindee
|
|
48
48
|
# @return [Net::HTTPResponse, nil]
|
49
49
|
def workflow_execution_req_post(input_source, opts)
|
50
50
|
uri = URI(@url)
|
51
|
-
params = {} # : Hash[
|
51
|
+
params = {} # : Hash[String | Symbol, untyped]
|
52
52
|
params[:full_text_ocr] = 'true' if opts.full_text
|
53
53
|
params[:rag] = 'true' if opts.rag
|
54
54
|
uri.query = URI.encode_www_form(params) if params.any?
|
@@ -62,7 +62,7 @@ module Mindee
|
|
62
62
|
if input_source.is_a?(Mindee::Input::Source::URLInputSource)
|
63
63
|
form_data.push ['document', input_source.url]
|
64
64
|
else
|
65
|
-
form_data.push input_source.read_contents
|
65
|
+
form_data.push ['document', *input_source.read_contents(close: opts.close_file)]
|
66
66
|
end
|
67
67
|
form_data.push ['alias', opts.document_alias] if opts.document_alias
|
68
68
|
form_data.push ['public_url', opts.public_url] if opts.public_url
|
data/lib/mindee/http.rb
CHANGED
@@ -69,7 +69,7 @@ module Mindee
|
|
69
69
|
# @return [FileInputSource] A BufferInput source.
|
70
70
|
def as_source
|
71
71
|
@buffer.rewind
|
72
|
-
Mindee::Input::Source::BytesInputSource.new(@buffer.read, @internal_file_name)
|
72
|
+
Mindee::Input::Source::BytesInputSource.new(@buffer.read || '', @internal_file_name)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
end
|
@@ -18,23 +18,20 @@ module Mindee
|
|
18
18
|
# @return [Origami::PDF] A PdfDocument handle.
|
19
19
|
def self.attach_image_as_new_file(input_buffer, format: 'jpg')
|
20
20
|
magick_image = MiniMagick::Image.read(input_buffer)
|
21
|
-
# NOTE:
|
22
|
-
# converted.
|
21
|
+
# NOTE: We force format consolidation to a single format to avoid frames being interpreted as the final output.
|
23
22
|
magick_image.format(format)
|
24
23
|
original_density = magick_image.resolution
|
25
|
-
scale_factor = original_density[0].to_f / 4.166666 #
|
26
|
-
# the pdf otherwise the resulting image shrinks.
|
24
|
+
scale_factor = original_density[0].to_f / 4.166666 # Convert from default 300 DPI to 72.
|
27
25
|
magick_image.format('pdf', 0, { density: scale_factor.to_s })
|
28
26
|
Origami::PDF.read(StringIO.new(magick_image.to_blob))
|
29
27
|
end
|
30
28
|
|
31
29
|
# Extracts multiple images from a given local input source.
|
32
30
|
#
|
33
|
-
# @param [
|
31
|
+
# @param [Input::Source::LocalInputSource] input_source
|
34
32
|
# @param [Integer] page_id ID of the Page to extract from.
|
35
|
-
# @param [Array<Array<
|
36
|
-
#
|
37
|
-
# @return [Array<Mindee::Image::ExtractedImage>] Extracted Images.
|
33
|
+
# @param [Array<Array<Geometry::Point>>, Array<Geometry::Quadrilateral>] polygons List of coordinates to extract.
|
34
|
+
# @return [Array<Image::ExtractedImage>] Extracted Images.
|
38
35
|
def self.extract_multiple_images_from_source(input_source, page_id, polygons)
|
39
36
|
new_stream = load_input_source_pdf_page_as_stringio(input_source, page_id)
|
40
37
|
new_stream.seek(0)
|
@@ -44,11 +41,11 @@ module Mindee
|
|
44
41
|
|
45
42
|
# Extracts images from their positions on a file (as polygons).
|
46
43
|
#
|
47
|
-
# @param [
|
44
|
+
# @param [Input::Source::LocalInputSource] input_source Local input source.
|
48
45
|
# @param [StringIO] pdf_stream Buffer of the PDF.
|
49
46
|
# @param [Integer] page_id Page ID.
|
50
|
-
# @param [Array<
|
51
|
-
# @return [Array<
|
47
|
+
# @param [Array<Geometry::Point, Geometry::Polygon, Geometry::Quadrilateral>] polygons
|
48
|
+
# @return [Array<Image::ExtractedImage>] Extracted Images.
|
52
49
|
def self.extract_images_from_polygons(input_source, pdf_stream, page_id, polygons)
|
53
50
|
extracted_elements = []
|
54
51
|
|
@@ -90,12 +87,12 @@ module Mindee
|
|
90
87
|
#
|
91
88
|
# @param [StringIO] buffer Buffer containing the image.
|
92
89
|
# @param [String] file_name Name for the file.
|
93
|
-
# @param [
|
94
|
-
# @param [
|
90
|
+
# @param [Integer] page_id ID of the page the file was universal from.
|
91
|
+
# @param [Integer] element_id ID of the element of a given page.
|
95
92
|
def self.create_extracted_image(buffer, file_name, page_id, element_id)
|
96
93
|
buffer.rewind
|
97
94
|
ExtractedImage.new(
|
98
|
-
|
95
|
+
Input::Source::BytesInputSource.new(buffer.read.to_s, file_name),
|
99
96
|
page_id,
|
100
97
|
element_id
|
101
98
|
)
|
@@ -109,7 +106,7 @@ module Mindee
|
|
109
106
|
def self.load_input_source_pdf_page_as_stringio(input_file, page_id)
|
110
107
|
input_file.io_stream.rewind
|
111
108
|
if input_file.pdf?
|
112
|
-
|
109
|
+
PDF::PDFProcessor.get_page(Origami::PDF.read(input_file.io_stream), page_id)
|
113
110
|
else
|
114
111
|
input_file.io_stream
|
115
112
|
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mindee
|
4
|
+
module Input
|
5
|
+
# Parameters to set when sending a file for inference.
|
6
|
+
class InferenceParameters
|
7
|
+
# @return [String] ID of the model (required).
|
8
|
+
attr_reader :model_id
|
9
|
+
|
10
|
+
# @return [Boolean, nil] Enable Retrieval-Augmented Generation.
|
11
|
+
attr_reader :rag
|
12
|
+
|
13
|
+
# @return [String, nil] Optional alias for the file.
|
14
|
+
attr_reader :file_alias
|
15
|
+
|
16
|
+
# @return [Array<String>, nil] Optional list of Webhooks IDs to propagate the API response to.
|
17
|
+
attr_reader :webhook_ids
|
18
|
+
|
19
|
+
# @return [PollingOptions] Options for polling. Set only if having timeout issues.
|
20
|
+
attr_reader :polling_options
|
21
|
+
|
22
|
+
# @return [Boolean, nil] Whether to close the file after parsing.
|
23
|
+
attr_reader :close_file
|
24
|
+
|
25
|
+
# @param [String] model_id ID of the model
|
26
|
+
# @param [FalseClass] rag Whether to enable rag.
|
27
|
+
# @param [nil] file_alias File alias, if applicable.
|
28
|
+
# @param [nil] webhook_ids
|
29
|
+
# @param [nil] polling_options
|
30
|
+
# @param [TrueClass] close_file
|
31
|
+
def initialize(model_id, rag: false, file_alias: nil, webhook_ids: nil, polling_options: nil, close_file: true)
|
32
|
+
raise Errors::MindeeInputError, 'Model ID is required.' if model_id.empty? || model_id.nil?
|
33
|
+
|
34
|
+
@model_id = model_id
|
35
|
+
@rag = rag || false
|
36
|
+
@file_alias = file_alias
|
37
|
+
@webhook_ids = webhook_ids || []
|
38
|
+
@polling_options = get_clean_polling_options(polling_options)
|
39
|
+
@close_file = close_file.nil? || close_file
|
40
|
+
end
|
41
|
+
|
42
|
+
# Validates the parameters for async auto-polling
|
43
|
+
def validate_async_params
|
44
|
+
min_delay_sec = 1
|
45
|
+
min_initial_delay_sec = 1
|
46
|
+
min_retries = 2
|
47
|
+
|
48
|
+
if @polling_options.delay_sec < min_delay_sec
|
49
|
+
raise ArgumentError,
|
50
|
+
"Cannot set auto-poll delay to less than #{min_delay_sec} second(s)"
|
51
|
+
end
|
52
|
+
if @polling_options.initial_delay_sec < min_initial_delay_sec
|
53
|
+
raise ArgumentError,
|
54
|
+
"Cannot set initial parsing delay to less than #{min_initial_delay_sec} second(s)"
|
55
|
+
end
|
56
|
+
return unless @polling_options.max_retries < min_retries
|
57
|
+
|
58
|
+
raise ArgumentError,
|
59
|
+
"Cannot set auto-poll retries to less than #{min_retries}"
|
60
|
+
end
|
61
|
+
|
62
|
+
# Loads a prediction from a Hash.
|
63
|
+
# @param [Hash] params Parameters to provide as a hash.
|
64
|
+
# @return [InferenceParameters]
|
65
|
+
def self.from_hash(params: {})
|
66
|
+
params.transform_keys!(&:to_sym)
|
67
|
+
|
68
|
+
if params.empty? || params[:model_id].nil? || params[:model_id].empty?
|
69
|
+
raise Errors::MindeeInputError, 'Model ID is required.'
|
70
|
+
end
|
71
|
+
|
72
|
+
model_id = params.fetch(:model_id)
|
73
|
+
rag = params.fetch(:rag, false)
|
74
|
+
file_alias = params.fetch(:file_alias, nil)
|
75
|
+
webhook_ids = params.fetch(:webhook_ids, [])
|
76
|
+
polling_options_input = params.fetch(:page_options, PollingOptions.new)
|
77
|
+
if polling_options_input.is_a?(Hash)
|
78
|
+
polling_options_input = polling_options_input.transform_keys(&:to_sym)
|
79
|
+
PollingOptions.new(
|
80
|
+
initial_delay_sec: polling_options_input.fetch(:initial_delay_sec, 2.0),
|
81
|
+
delay_sec: polling_options_input.fetch(:delay_sec, 1.5),
|
82
|
+
max_retries: polling_options_input.fetch(:max_retries, 80)
|
83
|
+
)
|
84
|
+
end
|
85
|
+
close_file = params.fetch(:close_file, true)
|
86
|
+
InferenceParameters.new(model_id, rag: rag, file_alias: file_alias, webhook_ids: webhook_ids,
|
87
|
+
close_file: close_file)
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
# Cleans a proper polling options object potentially from a hash.
|
93
|
+
# @param [Hash, PollingOptions, nil] polling_options Polling options.
|
94
|
+
# @return [PollingOptions] Valid polling options object.
|
95
|
+
def get_clean_polling_options(polling_options)
|
96
|
+
return PollingOptions.new if polling_options.is_a?(PollingOptions)
|
97
|
+
|
98
|
+
if polling_options.is_a?(Hash)
|
99
|
+
polling_options = polling_options.transform_keys(&:to_sym)
|
100
|
+
output_polling_options = PollingOptions.new(
|
101
|
+
initial_delay_sec: polling_options.fetch(:initial_delay_sec, 2.0),
|
102
|
+
delay_sec: polling_options.fetch(:delay_sec, 1.5),
|
103
|
+
max_retries: polling_options.fetch(:max_retries, 80)
|
104
|
+
)
|
105
|
+
else
|
106
|
+
output_polling_options = if polling_options.is_a?(PollingOptions)
|
107
|
+
polling_options || PollingOptions.new
|
108
|
+
else
|
109
|
+
PollingOptions.new
|
110
|
+
end
|
111
|
+
end
|
112
|
+
output_polling_options
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -62,11 +62,20 @@ module Mindee
|
|
62
62
|
end
|
63
63
|
|
64
64
|
# @param secret_key [String] Secret key, either a string or a byte/byte array.
|
65
|
-
# @param signature [String]
|
65
|
+
# @param signature [String] Signature to match
|
66
66
|
# @return [bool]
|
67
67
|
def valid_hmac_signature?(secret_key, signature)
|
68
68
|
signature == get_hmac_signature(secret_key)
|
69
69
|
end
|
70
|
+
|
71
|
+
# Deserializes a loaded response
|
72
|
+
# @param response_class [Parsing::V2::CommonResponse] class to return.
|
73
|
+
# @return [Parsing::V2::JobResponse, Parsing::V2::InferenceResponse]
|
74
|
+
def deserialize_response(response_class)
|
75
|
+
response_class.new(as_hash) # : Parsing::V2::JobResponse | Parsing::V2::InferenceResponse
|
76
|
+
rescue StandardError
|
77
|
+
raise Errors::MindeeInputError, 'Invalid response provided.'
|
78
|
+
end
|
70
79
|
end
|
71
80
|
end
|
72
81
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mindee
|
4
|
+
module Input
|
5
|
+
# Options for asynchronous polling.
|
6
|
+
class PollingOptions
|
7
|
+
# @return [Integer, Float] Initial delay before the first polling attempt (in seconds).
|
8
|
+
attr_reader :initial_delay_sec
|
9
|
+
|
10
|
+
# @return [Integer, Float] Delay between each polling attempt (in seconds).
|
11
|
+
attr_reader :delay_sec
|
12
|
+
|
13
|
+
# @return [Integer] Total number of polling attempts.
|
14
|
+
attr_reader :max_retries
|
15
|
+
|
16
|
+
# @param initial_delay_sec [Float] Initial delay before the first attempt (default:2.0).
|
17
|
+
# @param delay_sec [Float] Delay between attempts (default: 1.5).
|
18
|
+
# @param max_retries [Integer] Maximum number of retries (default:80).
|
19
|
+
def initialize(initial_delay_sec: 2.0, delay_sec: 1.5, max_retries: 80)
|
20
|
+
@initial_delay_sec = initial_delay_sec
|
21
|
+
@delay_sec = delay_sec
|
22
|
+
@max_retries = max_retries
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -18,12 +18,12 @@ module Mindee
|
|
18
18
|
|
19
19
|
# Overload of the same function to prevent a base64 from being re-encoded.
|
20
20
|
# @param close [bool]
|
21
|
-
# @return [Array<
|
21
|
+
# @return [Array<[String, aBinaryString ], [Hash, nil] >]
|
22
22
|
def read_contents(close: true)
|
23
23
|
@io_stream.seek(0)
|
24
24
|
data = @io_stream.read
|
25
25
|
@io_stream.close if close
|
26
|
-
[
|
26
|
+
[[data].pack('m'), { filename: Source.convert_to_unicode_escape(@filename) }]
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|