Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/gorgeous-rice-carry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@firebase/ai': patch
---

Fix `generateContentStream` returning wrong `inferenceSource`.
31 changes: 29 additions & 2 deletions packages/ai/src/methods/generate-content.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import {
import * as request from '../requests/request';
import {
generateContent,
generateContentStream,
templateGenerateContent,
templateGenerateContentStream
} from './generate-content';
Expand All @@ -35,6 +36,7 @@ import {
HarmBlockMethod,
HarmBlockThreshold,
HarmCategory,
InferenceSource,
Language,
Outcome
} from '../types';
Expand Down Expand Up @@ -548,8 +550,7 @@ describe('generateContent()', () => {
);
});
});
// TODO: define a similar test for generateContentStream
it('on-device', async () => {
it('generateContent on-device', async () => {
const chromeAdapter = fakeChromeAdapter;
const isAvailableStub = stub(chromeAdapter, 'isAvailable').resolves(true);
const mockResponse = getMockResponse(
Expand All @@ -566,9 +567,35 @@ describe('generateContent()', () => {
chromeAdapter
);
expect(result.response.text()).to.include('Mountain View, California');
expect(result.response.inferenceSource).to.equal(InferenceSource.ON_DEVICE);
expect(isAvailableStub).to.be.called;
expect(generateContentStub).to.be.calledWith(fakeRequestParams);
});
it('generateContentStream on-device', async () => {
const chromeAdapter = fakeChromeAdapter;
const isAvailableStub = stub(chromeAdapter, 'isAvailable').resolves(true);
const mockResponse = getMockResponseStreaming(
'vertexAI',
'streaming-success-basic-reply-short.txt'
);
const generateContentStreamStub = stub(
chromeAdapter,
'generateContentStream'
).resolves(mockResponse as Response);
const result = await generateContentStream(
fakeApiSettings,
'model',
fakeRequestParams,
chromeAdapter
);
const aggregatedResponse = await result.response;
expect(aggregatedResponse.text()).to.include('Cheyenne');
expect(aggregatedResponse.inferenceSource).to.equal(
InferenceSource.ON_DEVICE
);
expect(isAvailableStub).to.be.called;
expect(generateContentStreamStub).to.be.calledWith(fakeRequestParams);
});
});

describe('templateGenerateContent', () => {
Expand Down
6 changes: 5 additions & 1 deletion packages/ai/src/methods/generate-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,11 @@ export async function generateContentStream(
() =>
generateContentStreamOnCloud(apiSettings, model, params, requestOptions)
);
return processStream(callResult.response, apiSettings); // TODO: Map streaming responses
return processStream(
callResult.response,
apiSettings,
callResult.inferenceSource
); // TODO: Map streaming responses
Copy link
Contributor

@dlarocque dlarocque Nov 20, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This TODO was added by me and it's already done- can you remove it pls (:

}

async function generateContentOnCloud(
Expand Down
Loading