Skip to content

Commit f4cb879

Browse files
authored
Merge branch 'master' into chore-upgrade-handlebars
2 parents 3e66a89 + 72e61f7 commit f4cb879

File tree

10 files changed

+644
-107
lines changed

10 files changed

+644
-107
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
"@box/frontend": "^11.0.1",
136136
"@box/item-icon": "^2.30.42",
137137
"@box/languages": "^1.0.0",
138-
"@box/metadata-editor": "^1.55.5",
138+
"@box/metadata-editor": "^1.58.0",
139139
"@box/metadata-filter": "^1.41.3",
140140
"@box/metadata-view": "^1.10.0",
141141
"@box/react-virtualized": "^9.22.3-rc-box.10",
@@ -297,7 +297,7 @@
297297
"@box/combobox-with-api": "^1.41.42",
298298
"@box/copy-input": "^1.39.41",
299299
"@box/item-icon": "^2.30.42",
300-
"@box/metadata-editor": "^1.55.5",
300+
"@box/metadata-editor": "^1.58.0",
301301
"@box/metadata-filter": "^1.41.3",
302302
"@box/metadata-view": "^1.10.0",
303303
"@box/react-virtualized": "^9.22.3-rc-box.10",

src/api/Intelligence.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class Intelligence extends Base {
7777
throw new Error('Invalid item!');
7878
}
7979

80+
// See: https://developer.box.com/reference/post-ai-extract-structured
8081
const url = `${this.getBaseApiUrl()}/ai/extract_structured`;
8182

8283
const suggestionsResponse = await this.xhr.post({
@@ -85,9 +86,7 @@ class Intelligence extends Base {
8586
id: `file_${item.id}`,
8687
});
8788

88-
return !!suggestionsResponse?.data?.answer && typeof suggestionsResponse.data.answer === 'object'
89-
? suggestionsResponse.data.answer
90-
: suggestionsResponse.data;
89+
return suggestionsResponse.data;
9190
}
9291
}
9392

src/api/__tests__/Intelligence.test.js

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -124,26 +124,24 @@ describe('api/Intelligence', () => {
124124
}
125125
});
126126

127-
test.each`
128-
suggestionsFromServer | responseData
129-
${{ stringFieldKey: 'fieldVal1', floatFieldKey: 124.0, enumFieldKey: 'EnumOptionKey', multiSelectFieldKey: ['multiSelectOption1', 'multiSelectOption5'] }} | ${{ data: { stringFieldKey: 'fieldVal1', floatFieldKey: 124.0, enumFieldKey: 'EnumOptionKey', multiSelectFieldKey: ['multiSelectOption1', 'multiSelectOption5'] } }}
130-
${{ stringFieldKey: 'fieldVal1', floatFieldKey: 124.0, enumFieldKey: 'EnumOptionKey', multiSelectFieldKey: ['multiSelectOption1', 'multiSelectOption5'] }} | ${{ data: { answer: { stringFieldKey: 'fieldVal1', floatFieldKey: 124.0, enumFieldKey: 'EnumOptionKey', multiSelectFieldKey: ['multiSelectOption1', 'multiSelectOption5'] }, create_at: '2025-01-14T00:00:00-00:00' } }}
131-
${{}} | ${{ data: {} }}
132-
${{}} | ${{ data: { answer: {}, create_at: '2025-01-14T00:00:00-00:00' } }}
133-
`(
134-
'should return a successful response including the answer from the LLM',
135-
async ({ suggestionsFromServer, responseData }) => {
136-
intelligence.xhr.post = jest.fn().mockReturnValueOnce(responseData);
127+
test('should return data as-is', async () => {
128+
const responseData = {
129+
data: {
130+
answer: { field1: 'value1' },
131+
created_at: '2026-03-27T08:10:14.106-07:00',
132+
completion_reason: 'done',
133+
},
134+
};
135+
intelligence.xhr.post = jest.fn().mockReturnValueOnce(responseData);
137136

138-
const suggestions = await intelligence.extractStructured(request);
139-
expect(suggestions).toEqual(suggestionsFromServer);
140-
expect(intelligence.xhr.post).toHaveBeenCalledWith({
141-
url: `${intelligence.getBaseApiUrl()}/ai/extract_structured`,
142-
id: 'file_123',
143-
data: request,
144-
});
145-
},
146-
);
137+
const result = await intelligence.extractStructured(request);
138+
expect(result).toEqual(responseData.data);
139+
expect(intelligence.xhr.post).toHaveBeenCalledWith({
140+
url: `${intelligence.getBaseApiUrl()}/ai/extract_structured`,
141+
id: 'file_123',
142+
data: request,
143+
});
144+
});
147145

148146
test('should not return any suggestions when error is 400', async () => {
149147
const error = new Error();

src/api/schemas/AiExtractResponse.js

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,37 @@
33
* @author Box
44
*/
55

6-
export interface AiExtractResponse {}
6+
export interface AiExtractConfidenceScore {
7+
level: string;
8+
score: number;
9+
}
10+
11+
export interface AiExtractReference {
12+
itemId: string;
13+
page: number;
14+
text: string;
15+
boundingBox?: {
16+
left: number,
17+
top: number,
18+
right: number,
19+
bottom: number,
20+
};
21+
}
22+
23+
export interface AiAgentInfo {
24+
models?: Array<{
25+
name?: string,
26+
provider?: string,
27+
supported_purpose?: string,
28+
}>;
29+
processor?: string;
30+
}
31+
32+
export interface AiExtractResponse {
33+
answer: { [key: string]: any };
34+
created_at: string;
35+
completion_reason?: string;
36+
confidence_score?: { [key: string]: AiExtractConfidenceScore };
37+
reference?: { [key: string]: Array<AiExtractReference> };
38+
ai_agent_info?: AiAgentInfo;
39+
}

src/api/schemas/AiExtractStructured.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,12 @@ export interface AiExtractStructured {
8787
* – `AiAgentReference` : reference a custom AI-Agent by ID
8888
*/
8989
+ai_agent?: AiAgentExtractStructured | AiAgentReference;
90+
/**
91+
* When `true`, the response includes confidence scores for each extracted field.
92+
*/
93+
+include_confidence_score?: boolean;
94+
/**
95+
* When `true`, the response includes reference locations (bounding boxes) for each extracted field.
96+
*/
97+
+include_reference?: boolean;
9098
}

0 commit comments

Comments
 (0)