@proveanything/smartlinks 2.0.31 → 2.0.33
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.
- package/dist/ai-tools.d.ts +1 -0
- package/dist/ai-tools.js +4 -1
- package/dist/api/appObjects.js +26 -11
- package/dist/docs/API_SUMMARY.md +75 -5
- package/dist/docs/ai.md +24 -5
- package/dist/docs/app-objects.md +33 -0
- package/dist/docs/server-functions.md +629 -628
- package/dist/openapi.yaml +136 -4
- package/dist/types/ai.d.ts +76 -2
- package/dist/types/appObjects.d.ts +12 -1
- package/docs/API_SUMMARY.md +75 -5
- package/docs/ai.md +24 -5
- package/docs/app-objects.md +33 -0
- package/docs/server-functions.md +629 -628
- package/openapi.yaml +136 -4
- package/package.json +1 -1
package/dist/openapi.yaml
CHANGED
|
@@ -14509,6 +14509,21 @@ paths:
|
|
|
14509
14509
|
required: false
|
|
14510
14510
|
schema:
|
|
14511
14511
|
type: string
|
|
14512
|
+
- name: qFields
|
|
14513
|
+
in: query
|
|
14514
|
+
required: false
|
|
14515
|
+
schema:
|
|
14516
|
+
type: string
|
|
14517
|
+
- name: dataFilter
|
|
14518
|
+
in: query
|
|
14519
|
+
required: false
|
|
14520
|
+
schema:
|
|
14521
|
+
type: object
|
|
14522
|
+
additionalProperties:
|
|
14523
|
+
type: array
|
|
14524
|
+
items:
|
|
14525
|
+
type: object
|
|
14526
|
+
additionalProperties: true
|
|
14512
14527
|
- name: authorId
|
|
14513
14528
|
in: query
|
|
14514
14529
|
required: false
|
|
@@ -17108,12 +17123,42 @@ components:
|
|
|
17108
17123
|
type: number
|
|
17109
17124
|
required:
|
|
17110
17125
|
- imageUrl
|
|
17111
|
-
|
|
17126
|
+
ImageOcrArgs:
|
|
17112
17127
|
type: object
|
|
17113
17128
|
properties:
|
|
17114
|
-
|
|
17129
|
+
imageUrl:
|
|
17130
|
+
type: string
|
|
17131
|
+
url:
|
|
17132
|
+
type: string
|
|
17133
|
+
page:
|
|
17134
|
+
type: number
|
|
17135
|
+
dpi:
|
|
17136
|
+
type: number
|
|
17137
|
+
clip:
|
|
17138
|
+
$ref: "#/components/schemas/PdfClip"
|
|
17139
|
+
languages:
|
|
17140
|
+
type: array
|
|
17141
|
+
items:
|
|
17142
|
+
type: string
|
|
17143
|
+
PdfClip:
|
|
17144
|
+
type: object
|
|
17145
|
+
properties:
|
|
17146
|
+
x0:
|
|
17115
17147
|
type: object
|
|
17116
17148
|
additionalProperties: true
|
|
17149
|
+
required:
|
|
17150
|
+
- x0
|
|
17151
|
+
PdfCreateArgs:
|
|
17152
|
+
type: object
|
|
17153
|
+
properties:
|
|
17154
|
+
html:
|
|
17155
|
+
type: string
|
|
17156
|
+
format:
|
|
17157
|
+
type: string
|
|
17158
|
+
landscape:
|
|
17159
|
+
type: boolean
|
|
17160
|
+
margin:
|
|
17161
|
+
type: string
|
|
17117
17162
|
required:
|
|
17118
17163
|
- html
|
|
17119
17164
|
PdfFillArgs:
|
|
@@ -17145,8 +17190,13 @@ components:
|
|
|
17145
17190
|
type: object
|
|
17146
17191
|
properties:
|
|
17147
17192
|
url:
|
|
17148
|
-
type:
|
|
17149
|
-
|
|
17193
|
+
type: string
|
|
17194
|
+
page:
|
|
17195
|
+
type: number
|
|
17196
|
+
dpi:
|
|
17197
|
+
type: number
|
|
17198
|
+
clip:
|
|
17199
|
+
$ref: "#/components/schemas/PdfClip"
|
|
17150
17200
|
required:
|
|
17151
17201
|
- url
|
|
17152
17202
|
PdfExtractArgs:
|
|
@@ -17222,6 +17272,8 @@ components:
|
|
|
17222
17272
|
$ref: "#/components/schemas/ImageSearchStockArgs"
|
|
17223
17273
|
image.transform:
|
|
17224
17274
|
$ref: "#/components/schemas/ImageTransformArgs"
|
|
17275
|
+
image.ocr:
|
|
17276
|
+
$ref: "#/components/schemas/ImageOcrArgs"
|
|
17225
17277
|
pdf.create:
|
|
17226
17278
|
$ref: "#/components/schemas/PdfCreateArgs"
|
|
17227
17279
|
pdf.fill:
|
|
@@ -17255,6 +17307,7 @@ components:
|
|
|
17255
17307
|
- image.fromReference
|
|
17256
17308
|
- image.searchStock
|
|
17257
17309
|
- image.transform
|
|
17310
|
+
- image.ocr
|
|
17258
17311
|
- pdf.create
|
|
17259
17312
|
- pdf.fill
|
|
17260
17313
|
- pdf.merge
|
|
@@ -17371,6 +17424,75 @@ components:
|
|
|
17371
17424
|
additionalProperties: true
|
|
17372
17425
|
required:
|
|
17373
17426
|
- url
|
|
17427
|
+
PdfRenderTooLarge:
|
|
17428
|
+
type: object
|
|
17429
|
+
properties:
|
|
17430
|
+
error:
|
|
17431
|
+
type: object
|
|
17432
|
+
additionalProperties: true
|
|
17433
|
+
required:
|
|
17434
|
+
- error
|
|
17435
|
+
OcrBox:
|
|
17436
|
+
type: object
|
|
17437
|
+
properties:
|
|
17438
|
+
x:
|
|
17439
|
+
type: object
|
|
17440
|
+
additionalProperties: true
|
|
17441
|
+
required:
|
|
17442
|
+
- x
|
|
17443
|
+
OcrWord:
|
|
17444
|
+
type: object
|
|
17445
|
+
properties:
|
|
17446
|
+
text:
|
|
17447
|
+
type: object
|
|
17448
|
+
additionalProperties: true
|
|
17449
|
+
required:
|
|
17450
|
+
- text
|
|
17451
|
+
OcrLine:
|
|
17452
|
+
type: object
|
|
17453
|
+
properties:
|
|
17454
|
+
text:
|
|
17455
|
+
type: object
|
|
17456
|
+
additionalProperties: true
|
|
17457
|
+
required:
|
|
17458
|
+
- text
|
|
17459
|
+
ImageOcrResult:
|
|
17460
|
+
type: object
|
|
17461
|
+
properties:
|
|
17462
|
+
words:
|
|
17463
|
+
type: array
|
|
17464
|
+
items:
|
|
17465
|
+
$ref: "#/components/schemas/OcrWord"
|
|
17466
|
+
lines:
|
|
17467
|
+
type: array
|
|
17468
|
+
items:
|
|
17469
|
+
$ref: "#/components/schemas/OcrLine"
|
|
17470
|
+
text:
|
|
17471
|
+
type: string
|
|
17472
|
+
width:
|
|
17473
|
+
type: number
|
|
17474
|
+
height:
|
|
17475
|
+
type: number
|
|
17476
|
+
languages:
|
|
17477
|
+
type: array
|
|
17478
|
+
items:
|
|
17479
|
+
type: string
|
|
17480
|
+
page:
|
|
17481
|
+
type: number
|
|
17482
|
+
dpi:
|
|
17483
|
+
type: number
|
|
17484
|
+
clip:
|
|
17485
|
+
$ref: "#/components/schemas/PdfClip"
|
|
17486
|
+
engine:
|
|
17487
|
+
type: string
|
|
17488
|
+
required:
|
|
17489
|
+
- words
|
|
17490
|
+
- lines
|
|
17491
|
+
- text
|
|
17492
|
+
- width
|
|
17493
|
+
- height
|
|
17494
|
+
- languages
|
|
17495
|
+
- engine
|
|
17374
17496
|
PdfFieldMeta:
|
|
17375
17497
|
type: object
|
|
17376
17498
|
properties:
|
|
@@ -17498,6 +17620,7 @@ components:
|
|
|
17498
17620
|
- image.fromReference
|
|
17499
17621
|
- image.searchStock
|
|
17500
17622
|
- image.transform
|
|
17623
|
+
- image.ocr
|
|
17501
17624
|
- pdf.create
|
|
17502
17625
|
- pdf.fill
|
|
17503
17626
|
- pdf.merge
|
|
@@ -20052,6 +20175,15 @@ components:
|
|
|
20052
20175
|
type: string
|
|
20053
20176
|
q:
|
|
20054
20177
|
type: string
|
|
20178
|
+
qFields:
|
|
20179
|
+
type: string
|
|
20180
|
+
dataFilter:
|
|
20181
|
+
type: object
|
|
20182
|
+
additionalProperties:
|
|
20183
|
+
type: array
|
|
20184
|
+
items:
|
|
20185
|
+
type: object
|
|
20186
|
+
additionalProperties: true
|
|
20055
20187
|
authorId:
|
|
20056
20188
|
type: string
|
|
20057
20189
|
parentType:
|
package/dist/types/ai.d.ts
CHANGED
|
@@ -848,7 +848,7 @@ export interface CatalogResponse {
|
|
|
848
848
|
/** Capability tags a tool requires; scope a run with `allowCapabilities`. */
|
|
849
849
|
export type AiToolCapability = 'web:read' | 'ai:vision' | 'ai:image' | 'ai:text' | 'media:image' | 'media:pdf' | 'net:http';
|
|
850
850
|
/** The names of the built-in server-side agent tools (run via `server_tools`). */
|
|
851
|
-
export type AiToolName = 'web.fetchPage' | 'web.extractSchema' | 'web.screenshot' | 'web.search' | 'brand.assets' | 'document.read' | 'data.extract' | 'image.describe' | 'image.generate' | 'image.fromReference' | 'image.searchStock' | 'image.transform' | 'pdf.create' | 'pdf.fill' | 'pdf.merge' | 'pdf.inspect' | 'pdf.render' | 'pdf.extract' | 'pdf.decodeBarcodes' | 'pdf.inspectGraphics' | 'http.request' | 'translate';
|
|
851
|
+
export type AiToolName = 'web.fetchPage' | 'web.extractSchema' | 'web.screenshot' | 'web.search' | 'brand.assets' | 'document.read' | 'data.extract' | 'image.describe' | 'image.generate' | 'image.fromReference' | 'image.searchStock' | 'image.transform' | 'image.ocr' | 'pdf.create' | 'pdf.fill' | 'pdf.merge' | 'pdf.inspect' | 'pdf.render' | 'pdf.extract' | 'pdf.decodeBarcodes' | 'pdf.inspectGraphics' | 'http.request' | 'translate';
|
|
852
852
|
export interface WebFetchPageArgs {
|
|
853
853
|
url: string;
|
|
854
854
|
type?: string;
|
|
@@ -927,10 +927,32 @@ export interface ImageTransformArgs {
|
|
|
927
927
|
format?: 'jpeg' | 'png' | 'webp' | 'avif';
|
|
928
928
|
quality?: number;
|
|
929
929
|
}
|
|
930
|
+
/** Deterministic OCR (Google Vision; no generative model). Give `imageUrl`, or a PDF `url` (+ page/dpi/clip). */
|
|
931
|
+
export interface ImageOcrArgs {
|
|
932
|
+
imageUrl?: string;
|
|
933
|
+
url?: string;
|
|
934
|
+
/** PDF page, 1-based (default 1). */
|
|
935
|
+
page?: number;
|
|
936
|
+
/** PDF render dpi (default 300, max 600). */
|
|
937
|
+
dpi?: number;
|
|
938
|
+
/** PDF region, normalised 0–1 from the page top-left. */
|
|
939
|
+
clip?: PdfClip;
|
|
940
|
+
/** Language hints, e.g. ['en','fr','de','es','it','nl']. Optional — auto-detected otherwise. */
|
|
941
|
+
languages?: string[];
|
|
942
|
+
}
|
|
943
|
+
/** A region of a PDF page, normalised 0–1 from the page's top-left corner (x1 > x0, y1 > y0). */
|
|
944
|
+
export interface PdfClip {
|
|
945
|
+
x0: number;
|
|
946
|
+
y0: number;
|
|
947
|
+
x1: number;
|
|
948
|
+
y1: number;
|
|
949
|
+
}
|
|
930
950
|
export interface PdfCreateArgs {
|
|
931
951
|
html: string;
|
|
932
952
|
format?: string;
|
|
933
953
|
landscape?: boolean;
|
|
954
|
+
/** Page margin for all sides, e.g. "0" or "12mm" (default 18mm/14mm). Use "0" when the HTML sets its own margins. */
|
|
955
|
+
margin?: string;
|
|
934
956
|
}
|
|
935
957
|
export interface PdfFillArgs {
|
|
936
958
|
url: string;
|
|
@@ -948,7 +970,10 @@ export interface PdfInspectArgs {
|
|
|
948
970
|
export interface PdfRenderArgs {
|
|
949
971
|
url: string;
|
|
950
972
|
page?: number;
|
|
973
|
+
/** Default 150, max 600. Renders over 40 megapixels return `code: 'too_large'` with `suggestedDpi`. */
|
|
951
974
|
dpi?: number;
|
|
975
|
+
/** Render only this region (at the requested dpi) — read a panel of a large dieline without rasterising the whole sheet. */
|
|
976
|
+
clip?: PdfClip;
|
|
952
977
|
}
|
|
953
978
|
export interface PdfExtractArgs {
|
|
954
979
|
url: string;
|
|
@@ -993,6 +1018,7 @@ export interface AiToolArgsMap {
|
|
|
993
1018
|
'image.fromReference': ImageFromReferenceArgs;
|
|
994
1019
|
'image.searchStock': ImageSearchStockArgs;
|
|
995
1020
|
'image.transform': ImageTransformArgs;
|
|
1021
|
+
'image.ocr': ImageOcrArgs;
|
|
996
1022
|
'pdf.create': PdfCreateArgs;
|
|
997
1023
|
'pdf.fill': PdfFillArgs;
|
|
998
1024
|
'pdf.merge': PdfMergeArgs;
|
|
@@ -1041,7 +1067,8 @@ export interface ImageDescribeResult {
|
|
|
1041
1067
|
}
|
|
1042
1068
|
/** Result of a tool that produces a hosted binary (image.transform, pdf.*). */
|
|
1043
1069
|
export interface HostedAssetResult {
|
|
1044
|
-
hostedUrl: string | null;
|
|
1070
|
+
hostedUrl: string | null; /** Same as hostedUrl (pdf.create). */
|
|
1071
|
+
url?: string | null;
|
|
1045
1072
|
contentType?: string;
|
|
1046
1073
|
info?: {
|
|
1047
1074
|
width?: number;
|
|
@@ -1082,6 +1109,7 @@ export interface PdfInspectResult {
|
|
|
1082
1109
|
note: string;
|
|
1083
1110
|
pages: PdfInspectPage[];
|
|
1084
1111
|
}
|
|
1112
|
+
/** Hosted URLs are permanent (safe to pass to later tools in the same run). */
|
|
1085
1113
|
export interface PdfRenderResult {
|
|
1086
1114
|
url: string | null;
|
|
1087
1115
|
page: number;
|
|
@@ -1089,6 +1117,52 @@ export interface PdfRenderResult {
|
|
|
1089
1117
|
dpi: number;
|
|
1090
1118
|
width: number;
|
|
1091
1119
|
height: number;
|
|
1120
|
+
clip?: PdfClip;
|
|
1121
|
+
}
|
|
1122
|
+
/** Error shape when a render would exceed the pixel cap (pdf.render / image.ocr). */
|
|
1123
|
+
export interface PdfRenderTooLarge {
|
|
1124
|
+
error: string;
|
|
1125
|
+
code: 'too_large';
|
|
1126
|
+
requestedPixels: number;
|
|
1127
|
+
maxPixels: number;
|
|
1128
|
+
suggestedDpi: number;
|
|
1129
|
+
width: number;
|
|
1130
|
+
height: number;
|
|
1131
|
+
}
|
|
1132
|
+
/** Pixel box within the OCR'd image (top-left origin). */
|
|
1133
|
+
export interface OcrBox {
|
|
1134
|
+
x: number;
|
|
1135
|
+
y: number;
|
|
1136
|
+
w: number;
|
|
1137
|
+
h: number;
|
|
1138
|
+
}
|
|
1139
|
+
/** One OCR word. Punctuation is usually its own word. `confidence` is 0–1 — flag low values for review. */
|
|
1140
|
+
export interface OcrWord {
|
|
1141
|
+
text: string;
|
|
1142
|
+
confidence: number;
|
|
1143
|
+
bbox: OcrBox;
|
|
1144
|
+
}
|
|
1145
|
+
/** One OCR line, with spacing as printed; `confidence` is the mean of its words. */
|
|
1146
|
+
export interface OcrLine {
|
|
1147
|
+
text: string;
|
|
1148
|
+
confidence: number;
|
|
1149
|
+
bbox: OcrBox;
|
|
1150
|
+
}
|
|
1151
|
+
export interface ImageOcrResult {
|
|
1152
|
+
words: OcrWord[];
|
|
1153
|
+
lines: OcrLine[];
|
|
1154
|
+
/** Full text with line breaks. */
|
|
1155
|
+
text: string;
|
|
1156
|
+
/** Pixel size of the image that was read. */
|
|
1157
|
+
width: number | null;
|
|
1158
|
+
height: number | null;
|
|
1159
|
+
/** Detected languages (BCP-47). */
|
|
1160
|
+
languages: string[];
|
|
1161
|
+
/** Present when a PDF page was rendered. */
|
|
1162
|
+
page?: number;
|
|
1163
|
+
dpi?: number;
|
|
1164
|
+
clip?: PdfClip;
|
|
1165
|
+
engine: string;
|
|
1092
1166
|
}
|
|
1093
1167
|
/** Per-field metadata from pdf.extract when includeConfidence / includeBoxes is set. */
|
|
1094
1168
|
export interface PdfFieldMeta {
|
|
@@ -620,8 +620,19 @@ export interface RecordListQueryParams extends ListQueryParams {
|
|
|
620
620
|
variantId?: string;
|
|
621
621
|
/** Filter by batchId (indexed flat column) */
|
|
622
622
|
batchId?: string;
|
|
623
|
-
/** Full-text filter on data.label (
|
|
623
|
+
/** Full-text filter (case-insensitive substring) on data.label — or on `qFields` (admin) */
|
|
624
624
|
q?: string;
|
|
625
|
+
/**
|
|
626
|
+
* Admin only: which top-level `data` keys `q` searches (comma-separated, max 5).
|
|
627
|
+
* Default `label`. Example: `'value,label'`.
|
|
628
|
+
*/
|
|
629
|
+
qFields?: string;
|
|
630
|
+
/**
|
|
631
|
+
* Admin only: filter on top-level `data` keys. Each value is an exact match, an
|
|
632
|
+
* `in:a,b,c` list, or an array of values (any match). Max 10 keys.
|
|
633
|
+
* Example: `{ versionId: 'v1', zone: 'in:on_pack,unclear' }`.
|
|
634
|
+
*/
|
|
635
|
+
dataFilter?: Record<string, string | string[]>;
|
|
625
636
|
authorId?: string;
|
|
626
637
|
parentType?: string;
|
|
627
638
|
parentId?: string;
|
package/docs/API_SUMMARY.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Smartlinks API Summary
|
|
2
2
|
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.33 | Generated: 2026-10-01T17:58:12.047Z
|
|
4
4
|
|
|
5
5
|
This is a concise summary of all available API functions and types.
|
|
6
6
|
|
|
@@ -1447,10 +1447,32 @@ interface ImageTransformArgs {
|
|
|
1447
1447
|
}
|
|
1448
1448
|
```
|
|
1449
1449
|
|
|
1450
|
+
**ImageOcrArgs** (interface)
|
|
1451
|
+
```typescript
|
|
1452
|
+
interface ImageOcrArgs {
|
|
1453
|
+
imageUrl?: string
|
|
1454
|
+
url?: string
|
|
1455
|
+
page?: number
|
|
1456
|
+
dpi?: number
|
|
1457
|
+
clip?: PdfClip
|
|
1458
|
+
languages?: string[]
|
|
1459
|
+
}
|
|
1460
|
+
```
|
|
1461
|
+
|
|
1462
|
+
**PdfClip** (interface)
|
|
1463
|
+
```typescript
|
|
1464
|
+
interface PdfClip {
|
|
1465
|
+
x0: number; y0: number; x1: number; y1: number
|
|
1466
|
+
}
|
|
1467
|
+
```
|
|
1468
|
+
|
|
1450
1469
|
**PdfCreateArgs** (interface)
|
|
1451
1470
|
```typescript
|
|
1452
1471
|
interface PdfCreateArgs {
|
|
1453
|
-
html: string
|
|
1472
|
+
html: string
|
|
1473
|
+
format?: string
|
|
1474
|
+
landscape?: boolean
|
|
1475
|
+
margin?: string
|
|
1454
1476
|
}
|
|
1455
1477
|
```
|
|
1456
1478
|
|
|
@@ -1478,7 +1500,10 @@ interface PdfInspectArgs {
|
|
|
1478
1500
|
**PdfRenderArgs** (interface)
|
|
1479
1501
|
```typescript
|
|
1480
1502
|
interface PdfRenderArgs {
|
|
1481
|
-
url: string
|
|
1503
|
+
url: string
|
|
1504
|
+
page?: number
|
|
1505
|
+
dpi?: number
|
|
1506
|
+
clip?: PdfClip
|
|
1482
1507
|
}
|
|
1483
1508
|
```
|
|
1484
1509
|
|
|
@@ -1532,6 +1557,7 @@ interface AiToolArgsMap {
|
|
|
1532
1557
|
'image.fromReference': ImageFromReferenceArgs
|
|
1533
1558
|
'image.searchStock': ImageSearchStockArgs
|
|
1534
1559
|
'image.transform': ImageTransformArgs
|
|
1560
|
+
'image.ocr': ImageOcrArgs
|
|
1535
1561
|
'pdf.create': PdfCreateArgs
|
|
1536
1562
|
'pdf.fill': PdfFillArgs
|
|
1537
1563
|
'pdf.merge': PdfMergeArgs
|
|
@@ -1590,7 +1616,7 @@ interface ImageDescribeResult {
|
|
|
1590
1616
|
**HostedAssetResult** (interface)
|
|
1591
1617
|
```typescript
|
|
1592
1618
|
interface HostedAssetResult {
|
|
1593
|
-
|
|
1619
|
+
|
|
1594
1620
|
}
|
|
1595
1621
|
```
|
|
1596
1622
|
|
|
@@ -1625,7 +1651,51 @@ interface PdfInspectResult {
|
|
|
1625
1651
|
**PdfRenderResult** (interface)
|
|
1626
1652
|
```typescript
|
|
1627
1653
|
interface PdfRenderResult {
|
|
1628
|
-
url: string | null; page: number; pageCount: number; dpi: number; width: number; height: number
|
|
1654
|
+
url: string | null; page: number; pageCount: number; dpi: number; width: number; height: number; clip?: PdfClip
|
|
1655
|
+
}
|
|
1656
|
+
```
|
|
1657
|
+
|
|
1658
|
+
**PdfRenderTooLarge** (interface)
|
|
1659
|
+
```typescript
|
|
1660
|
+
interface PdfRenderTooLarge {
|
|
1661
|
+
error: string; code: 'too_large'; requestedPixels: number; maxPixels: number; suggestedDpi: number; width: number; height: number
|
|
1662
|
+
}
|
|
1663
|
+
```
|
|
1664
|
+
|
|
1665
|
+
**OcrBox** (interface)
|
|
1666
|
+
```typescript
|
|
1667
|
+
interface OcrBox {
|
|
1668
|
+
x: number; y: number; w: number; h: number
|
|
1669
|
+
}
|
|
1670
|
+
```
|
|
1671
|
+
|
|
1672
|
+
**OcrWord** (interface)
|
|
1673
|
+
```typescript
|
|
1674
|
+
interface OcrWord {
|
|
1675
|
+
text: string; confidence: number; bbox: OcrBox
|
|
1676
|
+
}
|
|
1677
|
+
```
|
|
1678
|
+
|
|
1679
|
+
**OcrLine** (interface)
|
|
1680
|
+
```typescript
|
|
1681
|
+
interface OcrLine {
|
|
1682
|
+
text: string; confidence: number; bbox: OcrBox
|
|
1683
|
+
}
|
|
1684
|
+
```
|
|
1685
|
+
|
|
1686
|
+
**ImageOcrResult** (interface)
|
|
1687
|
+
```typescript
|
|
1688
|
+
interface ImageOcrResult {
|
|
1689
|
+
words: OcrWord[]
|
|
1690
|
+
lines: OcrLine[]
|
|
1691
|
+
text: string
|
|
1692
|
+
width: number | null
|
|
1693
|
+
height: number | null
|
|
1694
|
+
languages: string[]
|
|
1695
|
+
page?: number
|
|
1696
|
+
dpi?: number
|
|
1697
|
+
clip?: PdfClip
|
|
1698
|
+
engine: string
|
|
1629
1699
|
}
|
|
1630
1700
|
```
|
|
1631
1701
|
|
package/docs/ai.md
CHANGED
|
@@ -327,7 +327,8 @@ in `input`.
|
|
|
327
327
|
| `pdf.fill` | Fill an AcroForm PDF's fields (`{ field: value }`) → hosted URL. |
|
|
328
328
|
| `pdf.merge` | Merge several PDFs into one, in order → hosted URL. |
|
|
329
329
|
| `pdf.inspect` | Cheap, no-AI introspection: page count/sizes, which pages have a real text layer, raster present, and a routing hint (`text` vs `vision`). |
|
|
330
|
-
| `pdf.render` | Rasterize one page to a PNG at a chosen DPI → hosted image URL (
|
|
330
|
+
| `pdf.render` | Rasterize one page — or just a region (`clip: { x0, y0, x1, y1 }`, 0–1 from top-left) — to a PNG at a chosen DPI → hosted image URL (permanent). Max 40 MP per call; larger requests return `code: "too_large"` + `suggestedDpi`. |
|
|
331
|
+
| `image.ocr` | **Deterministic OCR** (Google Vision, no generative model): exact characters with per-word `confidence` (0–1) and pixel `bbox`, plus lines with spacing as printed. Input: `imageUrl`, or a PDF `url` + `page` + `dpi` + optional `clip`. Optional `languages` hints. Use for small print and text outlined to curves. |
|
|
331
332
|
| `pdf.extract` | PDF → typed JSON in one call (schema and/or prompt). Auto-routes text vs vision. Optional per-field `confidence`/`source` (`includeConfidence`) and `bbox` (`includeBoxes`) in `fieldsMeta`. |
|
|
332
333
|
| `pdf.decodeBarcodes` | Deterministically decode barcodes/QR on a page (WASM, no AI) → value + symbology + page + bbox + confidence. Use this for barcode digits, never vision. |
|
|
333
334
|
| `pdf.inspectGraphics` | Prepress inspection: per-page path/image/outlined-text counts + colour spaces, plus named SPOT colours (e.g. "PANTONE 871 C"). No AI. |
|
|
@@ -341,18 +342,36 @@ in `input`.
|
|
|
341
342
|
returns typed JSON). It routes itself, but you can drive the route yourself: call `pdf.inspect`
|
|
342
343
|
first (deterministic, no AI) to see whether each page has a real text layer, then `pdf.extract`
|
|
343
344
|
(cheap text path) or `pdf.render` → `image.describe`/vision for curve-only or raster artwork.
|
|
344
|
-
- **
|
|
345
|
-
the
|
|
345
|
+
- **Read small print exactly** (INCI/allergen lists, net weight, text outlined to curves) → `image.ocr`
|
|
346
|
+
with a PDF `url`, `page`, `dpi: 300–400` and a `clip` around the panel. It returns the characters it
|
|
347
|
+
sees with a per-word confidence — it never "corrects" a misspelling the way a vision model can, so
|
|
348
|
+
flag words below ~0.9 for human review rather than re-reading them with a model.
|
|
349
|
+
- **Zoom in visually** (layout, artwork) → `pdf.render` with `clip` to rasterise just a region at a high
|
|
350
|
+
DPI, instead of the whole sheet. Renders over 40 MP return `code: "too_large"` with `suggestedDpi`
|
|
351
|
+
— retry at that dpi or with a smaller clip, don't blind-retry.
|
|
346
352
|
- **Barcodes / QR** → `pdf.decodeBarcodes` (deterministic WASM decode) — never trust vision for barcode
|
|
347
353
|
digits; it hallucinates them.
|
|
348
354
|
- **Prepress / print QA** (spot colours, colour spaces, vector vs raster) → `pdf.inspectGraphics`.
|
|
349
355
|
- **A review UI that flags guessed fields** → `pdf.extract` with `includeConfidence` (per-field
|
|
350
356
|
confidence + source) and `includeBoxes` (per-field bbox on text-native pages) in `fieldsMeta`.
|
|
351
357
|
- **Produce a PDF** → `pdf.create` (HTML → PDF), `pdf.fill` (populate an AcroForm's fields),
|
|
352
|
-
`pdf.merge` (combine several). These return a hosted `hostedUrl
|
|
358
|
+
`pdf.merge` (combine several). These return a hosted `hostedUrl` (`pdf.create` also returns it as
|
|
359
|
+
`url`). `pdf.create` loads remote `<img>` URLs before rendering and honours `page-break-inside`; pass
|
|
360
|
+
`margin: "0"` when your HTML sets its own body margin (default page margin is 18mm/14mm).
|
|
353
361
|
|
|
354
362
|
Every tool is also directly callable without the model loop via `ai.tools.run(collectionId, name,
|
|
355
|
-
args)` — e.g. render a page or extract fields straight from a UI, no agent round-trip
|
|
363
|
+
args)` — e.g. render a page or extract fields straight from a UI, no agent round-trip:
|
|
364
|
+
|
|
365
|
+
```ts
|
|
366
|
+
// Read the ingredients panel of a sleeve exactly (deterministic OCR of a clipped region)
|
|
367
|
+
const { result } = await SL.ai.tools.run(collectionId, 'image.ocr', {
|
|
368
|
+
url: sleevePdfUrl, page: 1, dpi: 400,
|
|
369
|
+
clip: { x0: 0.40, y0: 0.20, x1: 0.60, y1: 0.40 },
|
|
370
|
+
languages: ['en', 'fr'],
|
|
371
|
+
})
|
|
372
|
+
// result.lines → [{ text: 'INGREDIENTS: Aqua, Glycerin, …', confidence: 0.97, bbox: {…} }]
|
|
373
|
+
const toReview = result.words.filter((w) => w.confidence < 0.9)
|
|
374
|
+
```
|
|
356
375
|
|
|
357
376
|
Discover tools two ways:
|
|
358
377
|
- **Design time (typed):** import `BUILTIN_AI_TOOLS`, `AI_TOOL_NAMES`, and the per-tool arg types
|
package/docs/app-objects.md
CHANGED
|
@@ -747,6 +747,39 @@ const results = await app.records.list(collectionId, appId, {
|
|
|
747
747
|
|
|
748
748
|
> `q` is not a full-text index and does not return ranked results. For ranked relevance search over large corpora, use the Elasticsearch integration.
|
|
749
749
|
|
|
750
|
+
**Admin: search other data fields (`qFields`).** On the admin endpoint, `qFields` chooses which top-level `data` keys `q` searches (comma-separated, max 5; default `label`):
|
|
751
|
+
|
|
752
|
+
```typescript
|
|
753
|
+
const page = await app.records.list(collectionId, appId, {
|
|
754
|
+
recordType: 'packaging-field',
|
|
755
|
+
q: 'best before',
|
|
756
|
+
qFields: 'value,label', // match data.value OR data.label
|
|
757
|
+
limit: 100, offset: 0,
|
|
758
|
+
}, true);
|
|
759
|
+
```
|
|
760
|
+
|
|
761
|
+
### Filtering on data fields (admin)
|
|
762
|
+
|
|
763
|
+
On the admin endpoint, `dataFilter` filters on **top-level `data` keys** — an exact match, an `in:a,b,c` list, or an array (any value matches). Up to 10 keys; combine freely with `recordType`, `status`, `q`/`qFields` and pagination:
|
|
764
|
+
|
|
765
|
+
```typescript
|
|
766
|
+
const page = await app.records.list(collectionId, appId, {
|
|
767
|
+
recordType: 'packaging-field',
|
|
768
|
+
dataFilter: {
|
|
769
|
+
versionId: 'ver_123', // data.versionId = 'ver_123'
|
|
770
|
+
zone: 'in:on_pack,unclear', // data.zone is one of these
|
|
771
|
+
},
|
|
772
|
+
limit: 100, offset: 0,
|
|
773
|
+
}, true);
|
|
774
|
+
|
|
775
|
+
page.pagination.total // matches across all pages
|
|
776
|
+
page.pagination.hasMore // keep paging while true
|
|
777
|
+
```
|
|
778
|
+
|
|
779
|
+
- Values are compared as text (`data->>key`); nested keys and joins aren't supported.
|
|
780
|
+
- `limit` is capped at **100** per page — page with `offset` while `hasMore` is true.
|
|
781
|
+
- `status` also accepts `in:a,b` (e.g. `status: 'in:active,draft'`).
|
|
782
|
+
|
|
750
783
|
### External ID / ETL Workflow
|
|
751
784
|
|
|
752
785
|
`customId` and `sourceSystem` provide a stable external key pair for loading records from external systems (CMS, ERP, PIM, etc.):
|