From adf2db5cb2286fd4a0f765ec29103fbb3bc2e462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ianar=C3=A9=20S=C3=A9vi?= Date: Thu, 12 Feb 2026 10:48:50 +0100 Subject: [PATCH 1/2] rework product parameters directories --- src/v2/product/classification/classification.ts | 2 +- src/v2/product/classification/index.ts | 2 +- .../classification/{ => params}/classificationParameters.ts | 0 src/v2/product/classification/params/index.ts | 1 + src/v2/product/crop/crop.ts | 2 +- src/v2/product/crop/index.ts | 2 +- src/v2/product/crop/{ => params}/cropParameters.ts | 0 src/v2/product/crop/params/index.ts | 1 + src/v2/product/extraction/extraction.ts | 2 +- src/v2/product/extraction/index.ts | 5 +++-- src/v2/product/extraction/{ => params}/dataSchema.ts | 0 .../product/extraction/{ => params}/extractionParameters.ts | 0 src/v2/product/extraction/params/index.ts | 2 ++ src/v2/product/ocr/index.ts | 2 +- src/v2/product/ocr/ocr.ts | 2 +- src/v2/product/ocr/params/index.ts | 1 + src/v2/product/ocr/{ => params}/ocrParameters.ts | 0 src/v2/product/split/index.ts | 2 +- src/v2/product/split/params/index.ts | 1 + src/v2/product/split/{ => params}/splitParameters.ts | 0 src/v2/product/split/split.ts | 2 +- 21 files changed, 18 insertions(+), 11 deletions(-) rename src/v2/product/classification/{ => params}/classificationParameters.ts (100%) create mode 100644 src/v2/product/classification/params/index.ts rename src/v2/product/crop/{ => params}/cropParameters.ts (100%) create mode 100644 src/v2/product/crop/params/index.ts rename src/v2/product/extraction/{ => params}/dataSchema.ts (100%) rename src/v2/product/extraction/{ => params}/extractionParameters.ts (100%) create mode 100644 src/v2/product/extraction/params/index.ts create mode 100644 src/v2/product/ocr/params/index.ts rename src/v2/product/ocr/{ => params}/ocrParameters.ts (100%) create mode 100644 src/v2/product/split/params/index.ts rename src/v2/product/split/{ => params}/splitParameters.ts (100%) diff --git a/src/v2/product/classification/classification.ts b/src/v2/product/classification/classification.ts index ceafaf077..dcef46268 100644 --- a/src/v2/product/classification/classification.ts +++ b/src/v2/product/classification/classification.ts @@ -1,5 +1,5 @@ import { ClassificationResponse } from "./classificationResponse.js"; -import { ClassificationParameters } from "./classificationParameters.js"; +import { ClassificationParameters } from "./params/index.js"; import { BaseProduct } from "@/v2/product/baseProduct.js"; export class Classification extends BaseProduct { diff --git a/src/v2/product/classification/index.ts b/src/v2/product/classification/index.ts index 389576bdc..fad96ecc8 100644 --- a/src/v2/product/classification/index.ts +++ b/src/v2/product/classification/index.ts @@ -1,5 +1,5 @@ export { Classification } from "./classification.js"; -export { ClassificationParameters } from "./classificationParameters.js"; +export { ClassificationParameters } from "./params/index.js"; export { ClassificationResponse } from "./classificationResponse.js"; export { ClassificationInference } from "./classificationInference.js"; export { ClassificationResult } from "./classificationResult.js"; diff --git a/src/v2/product/classification/classificationParameters.ts b/src/v2/product/classification/params/classificationParameters.ts similarity index 100% rename from src/v2/product/classification/classificationParameters.ts rename to src/v2/product/classification/params/classificationParameters.ts diff --git a/src/v2/product/classification/params/index.ts b/src/v2/product/classification/params/index.ts new file mode 100644 index 000000000..60d0d0e56 --- /dev/null +++ b/src/v2/product/classification/params/index.ts @@ -0,0 +1 @@ +export { ClassificationParameters } from "./classificationParameters.js"; diff --git a/src/v2/product/crop/crop.ts b/src/v2/product/crop/crop.ts index 9254409a6..aaf1ade05 100644 --- a/src/v2/product/crop/crop.ts +++ b/src/v2/product/crop/crop.ts @@ -1,5 +1,5 @@ import { CropResponse } from "./cropResponse.js"; -import { CropParameters } from "./cropParameters.js"; +import { CropParameters } from "./params/index.js"; import { BaseProduct } from "@/v2/product/baseProduct.js"; export class Crop extends BaseProduct { diff --git a/src/v2/product/crop/index.ts b/src/v2/product/crop/index.ts index 7d3b2527c..13fcc6493 100644 --- a/src/v2/product/crop/index.ts +++ b/src/v2/product/crop/index.ts @@ -1,5 +1,5 @@ export { Crop } from "./crop.js"; -export { CropParameters } from "./cropParameters.js"; +export { CropParameters } from "./params/index.js"; export { CropInference } from "./cropInference.js"; export { CropItem } from "./cropItem.js"; export { CropResponse } from "./cropResponse.js"; diff --git a/src/v2/product/crop/cropParameters.ts b/src/v2/product/crop/params/cropParameters.ts similarity index 100% rename from src/v2/product/crop/cropParameters.ts rename to src/v2/product/crop/params/cropParameters.ts diff --git a/src/v2/product/crop/params/index.ts b/src/v2/product/crop/params/index.ts new file mode 100644 index 000000000..71b2e6e46 --- /dev/null +++ b/src/v2/product/crop/params/index.ts @@ -0,0 +1 @@ +export { CropParameters } from "./cropParameters.js"; diff --git a/src/v2/product/extraction/extraction.ts b/src/v2/product/extraction/extraction.ts index 15030511a..96febbc2d 100644 --- a/src/v2/product/extraction/extraction.ts +++ b/src/v2/product/extraction/extraction.ts @@ -1,5 +1,5 @@ import { ExtractionResponse } from "./extractionResponse.js"; -import { ExtractionParameters } from "./extractionParameters.js"; +import { ExtractionParameters } from "./params/index.js"; import { BaseProduct } from "@/v2/product/baseProduct.js"; export class Extraction extends BaseProduct { diff --git a/src/v2/product/extraction/index.ts b/src/v2/product/extraction/index.ts index d6cb61bd2..c0687fcac 100644 --- a/src/v2/product/extraction/index.ts +++ b/src/v2/product/extraction/index.ts @@ -1,6 +1,7 @@ export { Extraction } from "./extraction.js"; -export { ExtractionParameters } from "./extractionParameters.js"; -export { DataSchema } from "./dataSchema.js"; +export { + ExtractionParameters, DataSchemaReplace, DataSchemaField, DataSchema +} from "./params/index.js"; export { ExtractionInference } from "./extractionInference.js"; export { ExtractionActiveOptions } from "./extractionActiveOptions.js"; export { ExtractionResponse } from "./extractionResponse.js"; diff --git a/src/v2/product/extraction/dataSchema.ts b/src/v2/product/extraction/params/dataSchema.ts similarity index 100% rename from src/v2/product/extraction/dataSchema.ts rename to src/v2/product/extraction/params/dataSchema.ts diff --git a/src/v2/product/extraction/extractionParameters.ts b/src/v2/product/extraction/params/extractionParameters.ts similarity index 100% rename from src/v2/product/extraction/extractionParameters.ts rename to src/v2/product/extraction/params/extractionParameters.ts diff --git a/src/v2/product/extraction/params/index.ts b/src/v2/product/extraction/params/index.ts new file mode 100644 index 000000000..dce7c5b6b --- /dev/null +++ b/src/v2/product/extraction/params/index.ts @@ -0,0 +1,2 @@ +export { ExtractionParameters } from "./extractionParameters.js"; +export { DataSchema, DataSchemaField, DataSchemaReplace } from "./dataSchema.js"; diff --git a/src/v2/product/ocr/index.ts b/src/v2/product/ocr/index.ts index 4b6fabc75..781483dbd 100644 --- a/src/v2/product/ocr/index.ts +++ b/src/v2/product/ocr/index.ts @@ -1,5 +1,5 @@ export { Ocr } from "./ocr.js"; -export { OcrParameters } from "./ocrParameters.js"; +export { OcrParameters } from "./params/index.js"; export { OcrResponse } from "./ocrResponse.js"; export { OcrInference } from "./ocrInference.js"; export { OcrResult } from "./ocrResult.js"; diff --git a/src/v2/product/ocr/ocr.ts b/src/v2/product/ocr/ocr.ts index 8f742b091..adce9d1c9 100644 --- a/src/v2/product/ocr/ocr.ts +++ b/src/v2/product/ocr/ocr.ts @@ -1,5 +1,5 @@ import { OcrResponse } from "./ocrResponse.js"; -import { OcrParameters } from "./ocrParameters.js"; +import { OcrParameters } from "./params/index.js"; import { BaseProduct } from "@/v2/product/baseProduct.js"; export class Ocr extends BaseProduct { diff --git a/src/v2/product/ocr/params/index.ts b/src/v2/product/ocr/params/index.ts new file mode 100644 index 000000000..705ef889e --- /dev/null +++ b/src/v2/product/ocr/params/index.ts @@ -0,0 +1 @@ +export { OcrParameters } from "./ocrParameters.js"; diff --git a/src/v2/product/ocr/ocrParameters.ts b/src/v2/product/ocr/params/ocrParameters.ts similarity index 100% rename from src/v2/product/ocr/ocrParameters.ts rename to src/v2/product/ocr/params/ocrParameters.ts diff --git a/src/v2/product/split/index.ts b/src/v2/product/split/index.ts index 59891e87e..d92687bc8 100644 --- a/src/v2/product/split/index.ts +++ b/src/v2/product/split/index.ts @@ -1,5 +1,5 @@ export { Split } from "./split.js"; -export { SplitParameters } from "./splitParameters.js"; +export { SplitParameters } from "./params/index.js"; export { SplitResponse } from "./splitResponse.js"; export { SplitInference } from "./splitInference.js"; export { SplitRange } from "./splitRange.js"; diff --git a/src/v2/product/split/params/index.ts b/src/v2/product/split/params/index.ts new file mode 100644 index 000000000..964b656ad --- /dev/null +++ b/src/v2/product/split/params/index.ts @@ -0,0 +1 @@ +export { SplitParameters } from "./splitParameters.js"; diff --git a/src/v2/product/split/splitParameters.ts b/src/v2/product/split/params/splitParameters.ts similarity index 100% rename from src/v2/product/split/splitParameters.ts rename to src/v2/product/split/params/splitParameters.ts diff --git a/src/v2/product/split/split.ts b/src/v2/product/split/split.ts index 42d217715..8933c863e 100644 --- a/src/v2/product/split/split.ts +++ b/src/v2/product/split/split.ts @@ -1,5 +1,5 @@ import { SplitResponse } from "./splitResponse.js"; -import { SplitParameters } from "./splitParameters.js"; +import { SplitParameters } from "./params/index.js"; import { BaseProduct } from "@/v2/product/baseProduct.js"; export class Split extends BaseProduct { From 18f71c4d2bd093a7c804bfc520b21826a8dd53c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ianar=C3=A9=20S=C3=A9vi?= Date: Thu, 12 Feb 2026 10:55:34 +0100 Subject: [PATCH 2/2] rework extraction --- src/v2/product/extraction/index.ts | 5 +- .../product/extraction/params/dataSchema.ts | 107 +----------------- .../extraction/params/dataSchemaField.ts | 78 +++++++++++++ .../extraction/params/dataSchemaReplace.ts | 31 +++++ src/v2/product/extraction/params/index.ts | 4 +- tests/v2/product/extractionParameter.spec.ts | 4 +- 6 files changed, 117 insertions(+), 112 deletions(-) create mode 100644 src/v2/product/extraction/params/dataSchemaField.ts create mode 100644 src/v2/product/extraction/params/dataSchemaReplace.ts diff --git a/src/v2/product/extraction/index.ts b/src/v2/product/extraction/index.ts index c0687fcac..fd6960081 100644 --- a/src/v2/product/extraction/index.ts +++ b/src/v2/product/extraction/index.ts @@ -1,7 +1,6 @@ export { Extraction } from "./extraction.js"; -export { - ExtractionParameters, DataSchemaReplace, DataSchemaField, DataSchema -} from "./params/index.js"; +export { ExtractionParameters } from "./params/index.js"; +export * as params from "./params/index.js"; export { ExtractionInference } from "./extractionInference.js"; export { ExtractionActiveOptions } from "./extractionActiveOptions.js"; export { ExtractionResponse } from "./extractionResponse.js"; diff --git a/src/v2/product/extraction/params/dataSchema.ts b/src/v2/product/extraction/params/dataSchema.ts index 90579c9fb..29a23254e 100644 --- a/src/v2/product/extraction/params/dataSchema.ts +++ b/src/v2/product/extraction/params/dataSchema.ts @@ -1,110 +1,5 @@ import { StringDict } from "@/parsing/stringDict.js"; -import { MindeeError } from "@/errors/index.js"; - -export class DataSchemaField { - /** - * Display name for the field, also impacts inference results. - */ - public title: string; - /** - * Name of the field in the data schema. - */ - public name: string; - /** - * Whether this field can contain multiple values. - */ - public isArray: boolean; - /** - * Data type of the field. - */ - public type: string; - /** - * Allowed values when type is `classification`. Leave empty for other types. - */ - public classificationValues?: Array; - /** - * Whether to remove duplicate values in the array. - * Only applicable if `is_array` is True. - */ - public uniqueValues?: boolean; - /** - * Detailed description of what this field represents. - */ - public description?: string; - /** - * Optional extraction guidelines. - */ - public guidelines?: string; - /** - * Subfields when type is `nested_object`. Leave empty for other types. - */ - public nestedFields?: StringDict; - - constructor(fields: StringDict) { - this.name = fields["name"]; - this.title = fields["title"]; - this.isArray = fields["is_array"]; - this.type = fields["type"]; - this.classificationValues = fields["classification_values"]; - this.uniqueValues = fields["unique_values"]; - this.description = fields["description"]; - this.guidelines = fields["guidelines"]; - this.nestedFields = fields["nested_fields"]; - } - - toJSON() { - const out: Record = { - name: this.name, - title: this.title, - // eslint-disable-next-line @typescript-eslint/naming-convention,camelcase - is_array: this.isArray, - type: this.type, - }; - - // eslint-disable-next-line camelcase - if (this.classificationValues !== undefined) out.classification_values = this.classificationValues; - // eslint-disable-next-line camelcase - if (this.uniqueValues !== undefined) out.unique_values = this.uniqueValues; - if (this.description !== undefined) out.description = this.description; - if (this.guidelines !== undefined) out.guidelines = this.guidelines; - // eslint-disable-next-line camelcase - if (this.nestedFields !== undefined) out.nested_fields = this.nestedFields; - - return out; - } - - toString() { - return JSON.stringify(this.toJSON()); - } -} - -/** - * The structure to completely replace the data schema of the model. - */ -export class DataSchemaReplace { - /** - * List of fields in the Data Schema. - */ - fields: Array; - - constructor(dataSchemaReplace: StringDict) { - if (!dataSchemaReplace || !dataSchemaReplace.fields ) { - throw new MindeeError("Invalid Data Schema provided."); - } - if (dataSchemaReplace["fields"].length === 0) { - throw new TypeError("Data Schema replacement fields cannot be empty."); - } - this.fields = dataSchemaReplace["fields"].map((field: StringDict) => (new DataSchemaField(field))); - } - - toJSON() { - return { fields: this.fields.map(e => e.toJSON()) }; - } - - toString() { - return JSON.stringify(this.toJSON()); - } -} +import { DataSchemaReplace } from "./dataSchemaReplace.js"; /** * Modify the Data Schema. diff --git a/src/v2/product/extraction/params/dataSchemaField.ts b/src/v2/product/extraction/params/dataSchemaField.ts new file mode 100644 index 000000000..3b53fcd01 --- /dev/null +++ b/src/v2/product/extraction/params/dataSchemaField.ts @@ -0,0 +1,78 @@ +import { StringDict } from "@/parsing/index.js"; + +export class DataSchemaField { + /** + * Display name for the field, also impacts inference results. + */ + public title: string; + /** + * Name of the field in the data schema. + */ + public name: string; + /** + * Whether this field can contain multiple values. + */ + public isArray: boolean; + /** + * Data type of the field. + */ + public type: string; + /** + * Allowed values when type is `classification`. Leave empty for other types. + */ + public classificationValues?: Array; + /** + * Whether to remove duplicate values in the array. + * Only applicable if `is_array` is True. + */ + public uniqueValues?: boolean; + /** + * Detailed description of what this field represents. + */ + public description?: string; + /** + * Optional extraction guidelines. + */ + public guidelines?: string; + /** + * Subfields when type is `nested_object`. Leave empty for other types. + */ + public nestedFields?: StringDict; + + constructor(fields: StringDict) { + this.name = fields["name"]; + this.title = fields["title"]; + this.isArray = fields["is_array"]; + this.type = fields["type"]; + this.classificationValues = fields["classification_values"]; + this.uniqueValues = fields["unique_values"]; + this.description = fields["description"]; + this.guidelines = fields["guidelines"]; + this.nestedFields = fields["nested_fields"]; + } + + toJSON() { + const out: Record = { + name: this.name, + title: this.title, + // eslint-disable-next-line @typescript-eslint/naming-convention,camelcase + is_array: this.isArray, + type: this.type, + }; + + // eslint-disable-next-line camelcase + if (this.classificationValues !== undefined) out.classification_values = this.classificationValues; + // eslint-disable-next-line camelcase + if (this.uniqueValues !== undefined) out.unique_values = this.uniqueValues; + if (this.description !== undefined) out.description = this.description; + if (this.guidelines !== undefined) out.guidelines = this.guidelines; + // eslint-disable-next-line camelcase + if (this.nestedFields !== undefined) out.nested_fields = this.nestedFields; + + return out; + } + + toString() { + return JSON.stringify(this.toJSON()); + } +} diff --git a/src/v2/product/extraction/params/dataSchemaReplace.ts b/src/v2/product/extraction/params/dataSchemaReplace.ts new file mode 100644 index 000000000..b56b8564f --- /dev/null +++ b/src/v2/product/extraction/params/dataSchemaReplace.ts @@ -0,0 +1,31 @@ +import { StringDict } from "@/parsing/index.js"; +import { DataSchemaField } from "./dataSchemaField.js"; +import { MindeeError } from "@/errors/index.js"; + +/** + * The structure to completely replace the data schema of the model. + */ +export class DataSchemaReplace { + /** + * List of fields in the Data Schema. + */ + fields: Array; + + constructor(dataSchemaReplace: StringDict) { + if (!dataSchemaReplace || !dataSchemaReplace.fields ) { + throw new MindeeError("Invalid Data Schema provided."); + } + if (dataSchemaReplace["fields"].length === 0) { + throw new TypeError("Data Schema replacement fields cannot be empty."); + } + this.fields = dataSchemaReplace["fields"].map((field: StringDict) => (new DataSchemaField(field))); + } + + toJSON() { + return { fields: this.fields.map(e => e.toJSON()) }; + } + + toString() { + return JSON.stringify(this.toJSON()); + } +} diff --git a/src/v2/product/extraction/params/index.ts b/src/v2/product/extraction/params/index.ts index dce7c5b6b..f79e739ff 100644 --- a/src/v2/product/extraction/params/index.ts +++ b/src/v2/product/extraction/params/index.ts @@ -1,2 +1,4 @@ export { ExtractionParameters } from "./extractionParameters.js"; -export { DataSchema, DataSchemaField, DataSchemaReplace } from "./dataSchema.js"; +export { DataSchema } from "./dataSchema.js"; +export { DataSchemaReplace } from "./dataSchemaReplace.js"; +export { DataSchemaField } from "./dataSchemaField.js"; diff --git a/tests/v2/product/extractionParameter.spec.ts b/tests/v2/product/extractionParameter.spec.ts index ce554c173..3318210ff 100644 --- a/tests/v2/product/extractionParameter.spec.ts +++ b/tests/v2/product/extractionParameter.spec.ts @@ -7,7 +7,7 @@ import { extraction } from "@/v2/product/index.js"; let expectedDataSchemaDict: StringDict; let expectedDataSchemaString: string; -let expectedDataSchemaObject: extraction.DataSchema; +let expectedDataSchemaObject: extraction.params.DataSchema; describe("MindeeV2 - Extraction Parameter", () => { const modelIdValue = "test-model-id"; @@ -34,7 +34,7 @@ describe("MindeeV2 - Extraction Parameter", () => { ); expectedDataSchemaDict = JSON.parse(fileContents.toString()); expectedDataSchemaString = JSON.stringify(expectedDataSchemaDict); - expectedDataSchemaObject = new extraction.DataSchema(expectedDataSchemaDict); + expectedDataSchemaObject = new extraction.params.DataSchema(expectedDataSchemaDict); }); it("shouldn't replace when unset", () => {