@firebase/ai 2.4.0-canary.b7e18d0ff → 2.4.0-canary.c8263c471

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.
@@ -8,7 +8,7 @@ var util = require('@firebase/util');
8
8
  var logger$1 = require('@firebase/logger');
9
9
 
10
10
  var name = "@firebase/ai";
11
- var version = "2.4.0-canary.b7e18d0ff";
11
+ var version = "2.4.0-canary.c8263c471";
12
12
 
13
13
  /**
14
14
  * @license
@@ -327,6 +327,15 @@ const InferenceMode = {
327
327
  'ONLY_IN_CLOUD': 'only_in_cloud',
328
328
  'PREFER_IN_CLOUD': 'prefer_in_cloud'
329
329
  };
330
+ /**
331
+ * Indicates whether inference happened on-device or in-cloud.
332
+ *
333
+ * @beta
334
+ */
335
+ const InferenceSource = {
336
+ 'ON_DEVICE': 'on_device',
337
+ 'IN_CLOUD': 'in_cloud'
338
+ };
330
339
  /**
331
340
  * Represents the result of the code execution.
332
341
  *
@@ -1273,7 +1282,7 @@ function hasValidCandidates(response) {
1273
1282
  * Creates an EnhancedGenerateContentResponse object that has helper functions and
1274
1283
  * other modifications that improve usability.
1275
1284
  */
1276
- function createEnhancedContentResponse(response) {
1285
+ function createEnhancedContentResponse(response, inferenceSource = InferenceSource.IN_CLOUD) {
1277
1286
  /**
1278
1287
  * The Vertex AI backend omits default values.
1279
1288
  * This causes the `index` property to be omitted from the first candidate in the
@@ -1284,6 +1293,7 @@ function createEnhancedContentResponse(response) {
1284
1293
  response.candidates[0].index = 0;
1285
1294
  }
1286
1295
  const responseWithHelpers = addHelpers(response);
1296
+ responseWithHelpers.inferenceSource = inferenceSource;
1287
1297
  return responseWithHelpers;
1288
1298
  }
1289
1299
  /**
@@ -1660,16 +1670,16 @@ const responseLineRE = /^data\: (.*)(?:\n\n|\r\r|\r\n\r\n)/;
1660
1670
  *
1661
1671
  * @param response - Response from a fetch call
1662
1672
  */
1663
- function processStream(response, apiSettings) {
1673
+ function processStream(response, apiSettings, inferenceSource) {
1664
1674
  const inputStream = response.body.pipeThrough(new TextDecoderStream('utf8', { fatal: true }));
1665
1675
  const responseStream = getResponseStream(inputStream);
1666
1676
  const [stream1, stream2] = responseStream.tee();
1667
1677
  return {
1668
- stream: generateResponseSequence(stream1, apiSettings),
1669
- response: getResponsePromise(stream2, apiSettings)
1678
+ stream: generateResponseSequence(stream1, apiSettings, inferenceSource),
1679
+ response: getResponsePromise(stream2, apiSettings, inferenceSource)
1670
1680
  };
1671
1681
  }
1672
- async function getResponsePromise(stream, apiSettings) {
1682
+ async function getResponsePromise(stream, apiSettings, inferenceSource) {
1673
1683
  const allResponses = [];
1674
1684
  const reader = stream.getReader();
1675
1685
  while (true) {
@@ -1679,12 +1689,12 @@ async function getResponsePromise(stream, apiSettings) {
1679
1689
  if (apiSettings.backend.backendType === BackendType.GOOGLE_AI) {
1680
1690
  generateContentResponse = mapGenerateContentResponse(generateContentResponse);
1681
1691
  }
1682
- return createEnhancedContentResponse(generateContentResponse);
1692
+ return createEnhancedContentResponse(generateContentResponse, inferenceSource);
1683
1693
  }
1684
1694
  allResponses.push(value);
1685
1695
  }
1686
1696
  }
1687
- async function* generateResponseSequence(stream, apiSettings) {
1697
+ async function* generateResponseSequence(stream, apiSettings, inferenceSource) {
1688
1698
  const reader = stream.getReader();
1689
1699
  while (true) {
1690
1700
  const { value, done } = await reader.read();
@@ -1693,10 +1703,10 @@ async function* generateResponseSequence(stream, apiSettings) {
1693
1703
  }
1694
1704
  let enhancedResponse;
1695
1705
  if (apiSettings.backend.backendType === BackendType.GOOGLE_AI) {
1696
- enhancedResponse = createEnhancedContentResponse(mapGenerateContentResponse(value));
1706
+ enhancedResponse = createEnhancedContentResponse(mapGenerateContentResponse(value), inferenceSource);
1697
1707
  }
1698
1708
  else {
1699
- enhancedResponse = createEnhancedContentResponse(value);
1709
+ enhancedResponse = createEnhancedContentResponse(value, inferenceSource);
1700
1710
  }
1701
1711
  const firstCandidate = enhancedResponse.candidates?.[0];
1702
1712
  // Don't yield a response with no useful data for the developer.
@@ -1866,31 +1876,52 @@ const errorsCausingFallback = [
1866
1876
  */
1867
1877
  async function callCloudOrDevice(request, chromeAdapter, onDeviceCall, inCloudCall) {
1868
1878
  if (!chromeAdapter) {
1869
- return inCloudCall();
1879
+ return {
1880
+ response: await inCloudCall(),
1881
+ inferenceSource: InferenceSource.IN_CLOUD
1882
+ };
1870
1883
  }
1871
1884
  switch (chromeAdapter.mode) {
1872
1885
  case InferenceMode.ONLY_ON_DEVICE:
1873
1886
  if (await chromeAdapter.isAvailable(request)) {
1874
- return onDeviceCall();
1887
+ return {
1888
+ response: await onDeviceCall(),
1889
+ inferenceSource: InferenceSource.ON_DEVICE
1890
+ };
1875
1891
  }
1876
1892
  throw new AIError(AIErrorCode.UNSUPPORTED, 'Inference mode is ONLY_ON_DEVICE, but an on-device model is not available.');
1877
1893
  case InferenceMode.ONLY_IN_CLOUD:
1878
- return inCloudCall();
1894
+ return {
1895
+ response: await inCloudCall(),
1896
+ inferenceSource: InferenceSource.IN_CLOUD
1897
+ };
1879
1898
  case InferenceMode.PREFER_IN_CLOUD:
1880
1899
  try {
1881
- return await inCloudCall();
1900
+ return {
1901
+ response: await inCloudCall(),
1902
+ inferenceSource: InferenceSource.IN_CLOUD
1903
+ };
1882
1904
  }
1883
1905
  catch (e) {
1884
1906
  if (e instanceof AIError && errorsCausingFallback.includes(e.code)) {
1885
- return onDeviceCall();
1907
+ return {
1908
+ response: await onDeviceCall(),
1909
+ inferenceSource: InferenceSource.ON_DEVICE
1910
+ };
1886
1911
  }
1887
1912
  throw e;
1888
1913
  }
1889
1914
  case InferenceMode.PREFER_ON_DEVICE:
1890
1915
  if (await chromeAdapter.isAvailable(request)) {
1891
- return onDeviceCall();
1916
+ return {
1917
+ response: await onDeviceCall(),
1918
+ inferenceSource: InferenceSource.ON_DEVICE
1919
+ };
1892
1920
  }
1893
- return inCloudCall();
1921
+ return {
1922
+ response: await inCloudCall(),
1923
+ inferenceSource: InferenceSource.IN_CLOUD
1924
+ };
1894
1925
  default:
1895
1926
  throw new AIError(AIErrorCode.ERROR, `Unexpected infererence mode: ${chromeAdapter.mode}`);
1896
1927
  }
@@ -1920,8 +1951,8 @@ async function generateContentStreamOnCloud(apiSettings, model, params, requestO
1920
1951
  /* stream */ true, JSON.stringify(params), requestOptions);
1921
1952
  }
1922
1953
  async function generateContentStream(apiSettings, model, params, chromeAdapter, requestOptions) {
1923
- const response = await callCloudOrDevice(params, chromeAdapter, () => chromeAdapter.generateContentStream(params), () => generateContentStreamOnCloud(apiSettings, model, params, requestOptions));
1924
- return processStream(response, apiSettings); // TODO: Map streaming responses
1954
+ const callResult = await callCloudOrDevice(params, chromeAdapter, () => chromeAdapter.generateContentStream(params), () => generateContentStreamOnCloud(apiSettings, model, params, requestOptions));
1955
+ return processStream(callResult.response, apiSettings); // TODO: Map streaming responses
1925
1956
  }
1926
1957
  async function generateContentOnCloud(apiSettings, model, params, requestOptions) {
1927
1958
  if (apiSettings.backend.backendType === BackendType.GOOGLE_AI) {
@@ -1931,9 +1962,9 @@ async function generateContentOnCloud(apiSettings, model, params, requestOptions
1931
1962
  /* stream */ false, JSON.stringify(params), requestOptions);
1932
1963
  }
1933
1964
  async function generateContent(apiSettings, model, params, chromeAdapter, requestOptions) {
1934
- const response = await callCloudOrDevice(params, chromeAdapter, () => chromeAdapter.generateContent(params), () => generateContentOnCloud(apiSettings, model, params, requestOptions));
1935
- const generateContentResponse = await processGenerateContentResponse(response, apiSettings);
1936
- const enhancedResponse = createEnhancedContentResponse(generateContentResponse);
1965
+ const callResult = await callCloudOrDevice(params, chromeAdapter, () => chromeAdapter.generateContent(params), () => generateContentOnCloud(apiSettings, model, params, requestOptions));
1966
+ const generateContentResponse = await processGenerateContentResponse(callResult.response, apiSettings);
1967
+ const enhancedResponse = createEnhancedContentResponse(generateContentResponse, callResult.inferenceSource);
1937
1968
  return {
1938
1969
  response: enhancedResponse
1939
1970
  };
@@ -3825,6 +3856,7 @@ exports.ImagenModel = ImagenModel;
3825
3856
  exports.ImagenPersonFilterLevel = ImagenPersonFilterLevel;
3826
3857
  exports.ImagenSafetyFilterLevel = ImagenSafetyFilterLevel;
3827
3858
  exports.InferenceMode = InferenceMode;
3859
+ exports.InferenceSource = InferenceSource;
3828
3860
  exports.IntegerSchema = IntegerSchema;
3829
3861
  exports.Language = Language;
3830
3862
  exports.LiveGenerativeModel = LiveGenerativeModel;