Skip to content

Commit bcacf31

Browse files
authored
fix(generate): add output format metadata (#3633)
1 parent c188fc2 commit bcacf31

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

js/ai/src/generate/response.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,20 @@ export class GenerateResponse<O = unknown> implements ModelResponseData {
6767
const generatedMessage =
6868
response.message || response.candidates?.[0]?.message;
6969
if (generatedMessage) {
70+
if (
71+
options?.request?.output?.contentType ||
72+
options?.request?.output?.format
73+
) {
74+
generatedMessage.metadata = {
75+
...generatedMessage.metadata,
76+
generate: {
77+
output: {
78+
contentType: options?.request?.output?.contentType,
79+
format: options?.request?.output?.format,
80+
},
81+
},
82+
};
83+
}
7084
this.message = new Message<O>(generatedMessage, {
7185
parser: options?.parser,
7286
});

js/ai/tests/generate/response_test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,4 +244,40 @@ describe('GenerateResponse', () => {
244244
assert.deepStrictEqual(response.toolRequests, [toolCall1, toolCall2]);
245245
});
246246
});
247+
248+
it('returns metadata for output conformance', () => {
249+
const request: GenerateRequest = {
250+
messages: [],
251+
output: {
252+
constrained: true,
253+
format: 'json',
254+
contentType: 'application/json',
255+
schema: toJsonSchema({
256+
schema: z.object({
257+
name: z.string(),
258+
age: z.number(),
259+
}),
260+
}),
261+
},
262+
};
263+
264+
const response = new GenerateResponse(
265+
{
266+
message: {
267+
role: 'model',
268+
content: [{ text: '{"name": "John", "age": "30"}' }],
269+
},
270+
finishReason: 'stop',
271+
},
272+
{
273+
request,
274+
}
275+
);
276+
277+
assert.deepEqual(response.message?.metadata, {
278+
generate: {
279+
output: { contentType: 'application/json', format: 'json' },
280+
},
281+
});
282+
});
247283
});

0 commit comments

Comments
 (0)