Skip to content

Commit a755db5

Browse files
authored
feat(ai): improve warnings with provider and model id (#9815)
## Background Warning logging currently does not show model or provider id, making it harder to pinpoint issues (e.g. from server logs). Also, in the reranking feature ( #3764 ), a new `SharedV3Warning` type will be used, which is currently not supported in the warning logger. ## Summary * **breaking change**: different warning logger signature (affects user developed loggers) * display provider and model id in warnings * add `SharedV3Warning` type * support `SharedV3Warning` in warning logger ## Future Work * Use `SharedV3Warning` in models unless specific warning types are needed. * Add note to migration guide regarding this breaking change ## Related Issues Extracted from #3764
1 parent eaa536b commit a755db5

20 files changed

+402
-315
lines changed

.changeset/new-news-destroy.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'ai': patch
3+
---
4+
5+
feat(ai): improve warnings with provider and model id

.changeset/ninety-deers-drive.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ai-sdk/provider': patch
3+
---
4+
5+
feat(provider): Add SharedV3Warning type

packages/ai/src/generate-image/generate-image.test.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,11 @@ describe('generateImage', () => {
166166
});
167167

168168
expect(logWarningsSpy).toHaveBeenCalledOnce();
169-
expect(logWarningsSpy).toHaveBeenCalledWith(expectedWarnings);
169+
expect(logWarningsSpy).toHaveBeenCalledWith({
170+
warnings: expectedWarnings,
171+
provider: 'mock-provider',
172+
model: 'mock-model-id',
173+
});
170174
});
171175

172176
it('should call logWarnings with aggregated warnings from multiple calls', async () => {
@@ -207,7 +211,11 @@ describe('generateImage', () => {
207211
});
208212

209213
expect(logWarningsSpy).toHaveBeenCalledOnce();
210-
expect(logWarningsSpy).toHaveBeenCalledWith(expectedAggregatedWarnings);
214+
expect(logWarningsSpy).toHaveBeenCalledWith({
215+
warnings: expectedAggregatedWarnings,
216+
provider: 'mock-provider',
217+
model: 'mock-model-id',
218+
});
211219
});
212220

213221
it('should call logWarnings with empty array when no warnings are present', async () => {
@@ -223,7 +231,11 @@ describe('generateImage', () => {
223231
});
224232

225233
expect(logWarningsSpy).toHaveBeenCalledOnce();
226-
expect(logWarningsSpy).toHaveBeenCalledWith([]);
234+
expect(logWarningsSpy).toHaveBeenCalledWith({
235+
warnings: [],
236+
provider: 'mock-provider',
237+
model: 'mock-model-id',
238+
});
227239
});
228240

229241
describe('base64 image data', () => {

packages/ai/src/generate-image/generate-image.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ Only applicable for HTTP-based providers.
202202
responses.push(result.response);
203203
}
204204

205-
logWarnings(warnings);
205+
logWarnings({ warnings, provider: model.provider, model: model.modelId });
206206

207207
if (!images.length) {
208208
throw new NoImageGeneratedError({ responses });

packages/ai/src/generate-object/generate-object.test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,11 @@ describe('generateObject', () => {
205205
});
206206

207207
expect(logWarningsSpy).toHaveBeenCalledOnce();
208-
expect(logWarningsSpy).toHaveBeenCalledWith(expectedWarnings);
208+
expect(logWarningsSpy).toHaveBeenCalledWith({
209+
warnings: expectedWarnings,
210+
provider: 'mock-provider',
211+
model: 'mock-model-id',
212+
});
209213
});
210214

211215
it('should call logWarnings with empty array when no warnings are present', async () => {
@@ -222,7 +226,11 @@ describe('generateObject', () => {
222226
});
223227

224228
expect(logWarningsSpy).toHaveBeenCalledOnce();
225-
expect(logWarningsSpy).toHaveBeenCalledWith([]);
229+
expect(logWarningsSpy).toHaveBeenCalledWith({
230+
warnings: [],
231+
provider: 'mock-provider',
232+
model: 'mock-model-id',
233+
});
226234
});
227235

228236
describe('result.request', () => {

packages/ai/src/generate-object/generate-object.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,11 @@ Default and recommended: 'auto' (best mode for the model).
433433
response = generateResult.responseData;
434434
reasoning = generateResult.reasoning;
435435

436-
logWarnings(warnings);
436+
logWarnings({
437+
warnings,
438+
provider: model.provider,
439+
model: model.modelId,
440+
});
437441

438442
const object = await parseAndValidateObjectResultWithRepair(
439443
result,

packages/ai/src/generate-object/stream-object.test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,11 @@ describe('streamObject', () => {
18891889
await convertAsyncIterableToArray(result.partialObjectStream);
18901890

18911891
expect(logWarningsSpy).toHaveBeenCalledOnce();
1892-
expect(logWarningsSpy).toHaveBeenCalledWith(expectedWarnings);
1892+
expect(logWarningsSpy).toHaveBeenCalledWith({
1893+
warnings: expectedWarnings,
1894+
provider: 'mock-provider',
1895+
model: 'mock-model-id',
1896+
});
18931897
});
18941898

18951899
it('should call logWarnings with empty array when no warnings are present', async () => {
@@ -1907,7 +1911,11 @@ describe('streamObject', () => {
19071911
await convertAsyncIterableToArray(result.partialObjectStream);
19081912

19091913
expect(logWarningsSpy).toHaveBeenCalledOnce();
1910-
expect(logWarningsSpy).toHaveBeenCalledWith([]);
1914+
expect(logWarningsSpy).toHaveBeenCalledWith({
1915+
warnings: [],
1916+
provider: 'mock-provider',
1917+
model: 'mock-model-id',
1918+
});
19111919
});
19121920
});
19131921
});

packages/ai/src/generate-object/stream-object.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -723,7 +723,11 @@ class DefaultStreamObjectResult<PARTIAL, RESULT, ELEMENT_STREAM>
723723
});
724724

725725
// log warnings:
726-
logWarnings(warnings ?? []);
726+
logWarnings({
727+
warnings: warnings ?? [],
728+
provider: model.provider,
729+
model: model.modelId,
730+
});
727731

728732
// resolve promises that can be resolved now:
729733
self._usage.resolve(usage);

packages/ai/src/generate-speech/generate-speech.test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,11 @@ describe('generateSpeech', () => {
160160
});
161161

162162
expect(logWarningsSpy).toHaveBeenCalledOnce();
163-
expect(logWarningsSpy).toHaveBeenCalledWith(expectedWarnings);
163+
expect(logWarningsSpy).toHaveBeenCalledWith({
164+
warnings: expectedWarnings,
165+
provider: 'mock-provider',
166+
model: 'mock-model-id',
167+
});
164168
});
165169

166170
it('should call logWarnings with empty array when no warnings are present', async () => {
@@ -176,7 +180,11 @@ describe('generateSpeech', () => {
176180
});
177181

178182
expect(logWarningsSpy).toHaveBeenCalledOnce();
179-
expect(logWarningsSpy).toHaveBeenCalledWith([]);
183+
expect(logWarningsSpy).toHaveBeenCalledWith({
184+
warnings: [],
185+
provider: 'mock-provider',
186+
model: 'mock-model-id',
187+
});
180188
});
181189

182190
it('should return the audio data', async () => {

packages/ai/src/generate-speech/generate-speech.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,11 @@ Only applicable for HTTP-based providers.
147147
throw new NoSpeechGeneratedError({ responses: [result.response] });
148148
}
149149

150-
logWarnings(result.warnings);
150+
logWarnings({
151+
warnings: result.warnings,
152+
provider: resolvedModel.provider,
153+
model: resolvedModel.modelId,
154+
});
151155

152156
return new DefaultSpeechResult({
153157
audio: new DefaultGeneratedAudioFile({

0 commit comments

Comments
 (0)