blob: 0209ce697f9927e1c705da52c5c702fe1686edff [file] [log] [blame]
Mingyu Lei65f1a30b2024-05-29 06:21:471// Copyright 2024 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Mingyu Leifd46adf2024-06-14 06:06:405#include "content/browser/ai/echo_ai_manager_impl.h"
Mingyu Lei65f1a30b2024-05-29 06:21:476
Mingyu Lei682f6582024-06-14 04:26:597#include "base/no_destructor.h"
Mingyu Leif6f9bc1c2024-08-15 05:23:218#include "base/supports_user_data.h"
Mingyu Lei7bc64b42024-10-25 05:31:009#include "base/time/time.h"
Daseul Lee1b3f19a2025-02-05 16:30:0010#include "components/language/core/common/locale_util.h"
Mingyu Lei7cafeab2024-07-31 17:24:3211#include "components/optimization_guide/core/optimization_guide_features.h"
Mingyu Lei5299ac12024-11-13 02:06:1512#include "content/browser/ai/echo_ai_language_model.h"
Queenie Zhangf78ea0f2025-06-17 18:03:5013#include "content/browser/ai/echo_ai_proofreader.h"
Tsuyoshi Horo2e2bb012024-08-15 07:57:2914#include "content/browser/ai/echo_ai_rewriter.h"
Jiacheng Guo370bade42024-08-24 04:32:0315#include "content/browser/ai/echo_ai_summarizer.h"
Tsuyoshi Horo0a2451b2024-08-15 02:25:5116#include "content/browser/ai/echo_ai_writer.h"
Mingyu Leif6f9bc1c2024-08-15 05:23:2117#include "content/public/browser/browser_context.h"
Mingyu Lei4c04e112024-10-25 04:36:4418#include "content/public/browser/browser_thread.h"
Tsuyoshi Horo0a2451b2024-08-15 02:25:5119#include "mojo/public/cpp/bindings/remote.h"
Mingyu Lei65f1a30b2024-05-29 06:21:4720#include "mojo/public/cpp/bindings/self_owned_receiver.h"
Mike Wasserman16b5ba72025-03-24 21:17:0921#include "third_party/blink/public/common/features_generated.h"
Daseul Lee34f55f942025-02-06 19:49:2122#include "third_party/blink/public/mojom/ai/ai_common.mojom.h"
Mingyu Leifa311342025-01-22 04:46:1423#include "third_party/blink/public/mojom/ai/ai_language_model.mojom-forward.h"
Brad Triebwassere163bfa2025-04-18 02:22:0924#include "third_party/blink/public/mojom/ai/ai_language_model.mojom-shared.h"
Mingyu Lei5299ac12024-11-13 02:06:1525#include "third_party/blink/public/mojom/ai/ai_language_model.mojom.h"
Mingyu Lei65f1a30b2024-05-29 06:21:4726
27namespace content {
28
Mingyu Lei7bc64b42024-10-25 05:31:0029namespace {
30
Mingyu Leie08bb9c2024-11-25 08:40:4031const int kMockDownloadPreparationTimeMillisecond = 300;
Nathan Memmotte957ae4d2025-03-13 20:06:1532const int kMockModelSizeBytes = 0x10000;
Mingyu Lei7bc64b42024-10-25 05:31:0033
Daseul Lee34f55f942025-02-06 19:49:2134using blink::mojom::AILanguageCodePtr;
35
Daseul Lee1b3f19a2025-02-05 16:30:0036// TODO(crbug.com/394109104): This is duplicated from chrome AIManager in order
37// to keep the consistent wpt results run from CQ, which currently only supports
38// running wpt_internal/ tests on content_shell, using content EchoAIManager.
39// If there is enough divergence in two AI Managers' code, it should be
40// refactored to share the common code or use subclasses.
Mingyu Leifc5585f2025-02-13 01:33:0041auto is_language_supported = [](const AILanguageCodePtr& language) {
42 return language->code.empty() ||
43 language::ExtractBaseLanguage(language->code) == "en";
44};
45
46bool IsLanguagesSupported(const std::vector<AILanguageCodePtr>& languages) {
47 return std::ranges::all_of(languages, is_language_supported);
48}
49
Daseul Lee34f55f942025-02-06 19:49:2150bool SupportedLanguages(const std::vector<AILanguageCodePtr>& input,
51 const std::vector<AILanguageCodePtr>& context,
52 const AILanguageCodePtr& output) {
Mingyu Leifc5585f2025-02-13 01:33:0053 return IsLanguagesSupported(input) && IsLanguagesSupported(context) &&
54 is_language_supported(output);
Daseul Lee1b3f19a2025-02-05 16:30:0055}
56
Mike Wasserman88fbc012025-05-23 22:56:0957// Returns whether optional LanguageModel expected_inputs or expected_outputs
58// vectors contain only supported languages. Returns true for absent languages.
59bool AreExpectedLanguagesSupported(
60 const std::optional<std::vector<blink::mojom::AILanguageModelExpectedPtr>>&
61 expected_vector) {
62 if (!expected_vector) {
63 return true;
64 }
65 for (const auto& expected_entry : expected_vector.value()) {
66 if (expected_entry->languages.has_value() &&
67 !IsLanguagesSupported(expected_entry->languages.value())) {
68 return false;
69 }
70 }
71 return true;
72}
73
74// Returns whether `options` contains any unsupported AILanguageModelPromptType.
75bool HasUnsupportedType(
76 const blink::mojom::AILanguageModelCreateOptionsPtr& options) {
77 bool has_unsupported_type = false;
78 if (options) {
79 if (options->expected_inputs.has_value()) {
80 for (const auto& expected_input : options->expected_inputs.value()) {
81 has_unsupported_type |=
82 expected_input->type !=
83 blink::mojom::AILanguageModelPromptType::kText &&
84 !base::FeatureList::IsEnabled(
85 blink::features::kAIPromptAPIMultimodalInput);
86 }
87 }
88 if (options->expected_outputs.has_value()) {
89 for (const auto& expected_output : options->expected_outputs.value()) {
90 has_unsupported_type |= expected_output->type !=
91 blink::mojom::AILanguageModelPromptType::kText;
92 }
93 }
94 }
95 return has_unsupported_type;
96}
97
Mingyu Lei7bc64b42024-10-25 05:31:0098} // namespace
99
Fergal Dalye835ff22024-10-11 20:07:13100EchoAIManagerImpl::EchoAIManagerImpl() = default;
Mingyu Lei65f1a30b2024-05-29 06:21:47101
Mingyu Leifd46adf2024-06-14 06:06:40102EchoAIManagerImpl::~EchoAIManagerImpl() = default;
Mingyu Lei65f1a30b2024-05-29 06:21:47103
104// static
Mingyu Leifd46adf2024-06-14 06:06:40105void EchoAIManagerImpl::Create(
Mingyu Lei9de94c62024-05-29 07:14:42106 mojo::PendingReceiver<blink::mojom::AIManager> receiver) {
Fergal Dalye835ff22024-10-11 20:07:13107 static base::NoDestructor<EchoAIManagerImpl> ai;
Mingyu Lei46478fe2024-11-01 08:09:27108 ai->receivers_.Add(ai.get(), std::move(receiver));
Mingyu Lei65f1a30b2024-05-29 06:21:47109}
110
Mingyu Lei5299ac12024-11-13 02:06:15111void EchoAIManagerImpl::CanCreateLanguageModel(
Mike Wasserman16b5ba72025-03-24 21:17:09112 blink::mojom::AILanguageModelCreateOptionsPtr options,
Mingyu Lei5299ac12024-11-13 02:06:15113 CanCreateLanguageModelCallback callback) {
Mike Wasserman88fbc012025-05-23 22:56:09114 if (HasUnsupportedType(options)) {
115 std::move(callback).Run(blink::mojom::ModelAvailabilityCheckResult::
116 kUnavailableModelAdaptationNotAvailable);
117 return;
118 }
119 if (options && (!AreExpectedLanguagesSupported(options->expected_inputs) ||
120 !AreExpectedLanguagesSupported(options->expected_outputs))) {
121 std::move(callback).Run(blink::mojom::ModelAvailabilityCheckResult::
122 kUnavailableUnsupportedLanguage);
123 return;
Mingyu Leifc5585f2025-02-13 01:33:00124 }
125
Mingyu Lei4ec236f2024-06-13 05:58:27126 std::move(callback).Run(
Mike Wasserman311bf8c2025-07-10 18:13:37127 IsModelDownloadedForCurrentReciever()
Daseul Lee18e6e222025-06-09 19:09:57128 ? blink::mojom::ModelAvailabilityCheckResult::kAvailable
129 : blink::mojom::ModelAvailabilityCheckResult::kDownloadable);
Mingyu Lei65f1a30b2024-05-29 06:21:47130}
131
Mingyu Lei5299ac12024-11-13 02:06:15132void EchoAIManagerImpl::CreateLanguageModel(
133 mojo::PendingRemote<blink::mojom::AIManagerCreateLanguageModelClient>
134 client,
135 blink::mojom::AILanguageModelCreateOptionsPtr options) {
136 mojo::Remote<blink::mojom::AIManagerCreateLanguageModelClient> client_remote(
Mingyu Lei633aa242024-10-04 17:10:12137 std::move(client));
Mingyu Lei4c04e112024-10-25 04:36:44138
Mike Wassermane1e76c82025-05-05 18:30:39139 size_t initial_size = 0;
140 for (const auto& initial_prompt : options->initial_prompts) {
Brad Triebwasser2b833ce2025-05-23 05:40:07141 for (const auto& content : initial_prompt->content) {
142 if (content->is_text()) {
143 initial_size += content->get_text().size();
144 } else {
145 initial_size += 100; // TODO(crbug.com/415304330): Improve estimate.
146 }
147 if (initial_size > kMaxContextSizeInTokens) {
148 client_remote->OnError(
Daseul Lee644db352025-05-27 19:33:32149 blink::mojom::AIManagerCreateClientError::kInitialInputTooLarge,
150 blink::mojom::QuotaErrorInfo::New(initial_size,
151 kMaxContextSizeInTokens));
Brad Triebwasser2b833ce2025-05-23 05:40:07152 return;
153 }
Mike Wassermane1e76c82025-05-05 18:30:39154 }
Mingyu Leie08bb9c2024-11-25 08:40:40155 }
156
Mike Wasserman88fbc012025-05-23 22:56:09157 if (HasUnsupportedType(options)) {
158 client_remote->OnError(
Daseul Lee644db352025-05-27 19:33:32159 blink::mojom::AIManagerCreateClientError::kUnableToCreateSession,
160 /*quota_error_info=*/nullptr);
Mike Wasserman88fbc012025-05-23 22:56:09161 return;
162 }
163 if (options && (!AreExpectedLanguagesSupported(options->expected_inputs) ||
164 !AreExpectedLanguagesSupported(options->expected_outputs))) {
165 client_remote->OnError(
Daseul Lee644db352025-05-27 19:33:32166 blink::mojom::AIManagerCreateClientError::kUnsupportedLanguage,
167 /*quota_error_info=*/nullptr);
Mike Wasserman88fbc012025-05-23 22:56:09168 return;
169 }
Brad Triebwassere163bfa2025-04-18 02:22:09170 base::flat_set<blink::mojom::AILanguageModelPromptType> enabled_input_types;
171 if (options->expected_inputs.has_value()) {
172 for (const auto& expected_input : options->expected_inputs.value()) {
173 enabled_input_types.insert(expected_input->type);
174 }
175 }
176
Brad Triebwasser666c7c82025-06-09 22:25:25177 auto return_language_model_callback = base::BindOnce(
178 &EchoAIManagerImpl::ReturnAILanguageModelCreationResult,
179 weak_ptr_factory_.GetWeakPtr(), std::move(client_remote),
180 std::move(options->sampling_params), enabled_input_types, initial_size);
Jiacheng Guo50379cb2024-12-09 06:10:43181
Mike Wasserman311bf8c2025-07-10 18:13:37182 if (!IsModelDownloadedForCurrentReciever()) {
183 // Simulate downloading the model; cache state for the current receiver.
184 model_downloaded_receivers_.insert(receivers_.current_receiver());
Daseul Lee18e6e222025-06-09 19:09:57185 content::GetUIThreadTaskRunner()->PostDelayedTask(
186 FROM_HERE,
187 base::BindOnce(&EchoAIManagerImpl::DoMockDownloadingAndReturn,
188 weak_ptr_factory_.GetWeakPtr(),
189 std::move(return_language_model_callback)),
190 base::Milliseconds(kMockDownloadPreparationTimeMillisecond));
191 } else {
192 std::move(return_language_model_callback).Run();
193 }
Mingyu Lei65f1a30b2024-05-29 06:21:47194}
195
Jiacheng Guo370bade42024-08-24 04:32:03196void EchoAIManagerImpl::CanCreateSummarizer(
Daseul Lee1b3f19a2025-02-05 16:30:00197 blink::mojom::AISummarizerCreateOptionsPtr options,
Jiacheng Guo370bade42024-08-24 04:32:03198 CanCreateSummarizerCallback callback) {
Daseul Leeafef8e822025-05-15 21:52:24199 CanCreateWritingAssistanceClient<blink::mojom::AISummarizerCreateOptionsPtr,
200 CanCreateSummarizerCallback>(
201 std::move(options), std::move(callback));
Jiacheng Guo370bade42024-08-24 04:32:03202}
203
204void EchoAIManagerImpl::CreateSummarizer(
Jiacheng Guo49e046a72024-08-29 06:46:15205 mojo::PendingRemote<blink::mojom::AIManagerCreateSummarizerClient> client,
Tsuyoshi Horode5d5f8a2024-09-03 07:31:13206 blink::mojom::AISummarizerCreateOptionsPtr options) {
Daseul Leeafef8e822025-05-15 21:52:24207 CreateWritingAssistanceClient<blink::mojom::AISummarizerCreateOptionsPtr,
208 blink::mojom::AIManagerCreateSummarizerClient,
209 blink::mojom::AISummarizer, EchoAISummarizer>(
210 std::move(client), std::move(options));
Jiacheng Guo370bade42024-08-24 04:32:03211}
212
Mingyu Leie7787432025-01-28 09:23:17213void EchoAIManagerImpl::GetLanguageModelParams(
214 GetLanguageModelParamsCallback callback) {
215 std::move(callback).Run(blink::mojom::AILanguageModelParams::New(
Mingyu Leifa311342025-01-22 04:46:14216 blink::mojom::AILanguageModelSamplingParams::New(
217 optimization_guide::features::GetOnDeviceModelDefaultTopK(),
218 optimization_guide::features::GetOnDeviceModelDefaultTemperature()),
219 blink::mojom::AILanguageModelSamplingParams::New(
220 optimization_guide::features::GetOnDeviceModelMaxTopK(),
221 /*temperature=*/2.0f)));
Mingyu Lei65f1a30b2024-05-29 06:21:47222}
223
Mike Wassermand5077dff2024-12-13 18:10:11224void EchoAIManagerImpl::CanCreateWriter(
225 blink::mojom::AIWriterCreateOptionsPtr options,
226 CanCreateWriterCallback callback) {
Daseul Leeafef8e822025-05-15 21:52:24227 CanCreateWritingAssistanceClient<blink::mojom::AIWriterCreateOptionsPtr,
228 CanCreateWriterCallback>(
229 std::move(options), std::move(callback));
Mike Wassermand5077dff2024-12-13 18:10:11230}
231
Tsuyoshi Horo0a2451b2024-08-15 02:25:51232void EchoAIManagerImpl::CreateWriter(
Tsuyoshi Horode5d5f8a2024-09-03 07:31:13233 mojo::PendingRemote<blink::mojom::AIManagerCreateWriterClient> client,
234 blink::mojom::AIWriterCreateOptionsPtr options) {
Daseul Leeafef8e822025-05-15 21:52:24235 CreateWritingAssistanceClient<blink::mojom::AIWriterCreateOptionsPtr,
236 blink::mojom::AIManagerCreateWriterClient,
237 blink::mojom::AIWriter, EchoAIWriter>(
238 std::move(client), std::move(options));
Tsuyoshi Horo0a2451b2024-08-15 02:25:51239}
240
Mike Wassermand5077dff2024-12-13 18:10:11241void EchoAIManagerImpl::CanCreateRewriter(
242 blink::mojom::AIRewriterCreateOptionsPtr options,
243 CanCreateRewriterCallback callback) {
Daseul Leeafef8e822025-05-15 21:52:24244 CanCreateWritingAssistanceClient<blink::mojom::AIRewriterCreateOptionsPtr,
245 CanCreateRewriterCallback>(
246 std::move(options), std::move(callback));
Mike Wassermand5077dff2024-12-13 18:10:11247}
248
Tsuyoshi Horo2e2bb012024-08-15 07:57:29249void EchoAIManagerImpl::CreateRewriter(
Tsuyoshi Horode5d5f8a2024-09-03 07:31:13250 mojo::PendingRemote<blink::mojom::AIManagerCreateRewriterClient> client,
251 blink::mojom::AIRewriterCreateOptionsPtr options) {
Daseul Leeafef8e822025-05-15 21:52:24252 CreateWritingAssistanceClient<blink::mojom::AIRewriterCreateOptionsPtr,
253 blink::mojom::AIManagerCreateRewriterClient,
254 blink::mojom::AIRewriter, EchoAIRewriter>(
255 std::move(client), std::move(options));
256}
257
Queenie Zhangf78ea0f2025-06-17 18:03:50258void EchoAIManagerImpl::CanCreateProofreader(
259 blink::mojom::AIProofreaderCreateOptionsPtr options,
260 CanCreateProofreaderCallback callback) {
261 if (options &&
262 !SupportedLanguages(options->expected_input_languages, {},
263 options->correction_explanation_language)) {
264 std::move(callback).Run(blink::mojom::ModelAvailabilityCheckResult::
265 kUnavailableUnsupportedLanguage);
266 return;
267 }
268 CanCreateClient<CanCreateProofreaderCallback>(std::move(callback));
269}
270
271void EchoAIManagerImpl::CreateProofreader(
272 mojo::PendingRemote<blink::mojom::AIManagerCreateProofreaderClient> client,
273 blink::mojom::AIProofreaderCreateOptionsPtr options) {
274 mojo::Remote<blink::mojom::AIManagerCreateProofreaderClient> client_remote(
275 std::move(client));
276 if (options &&
277 !SupportedLanguages(options->expected_input_languages, {},
278 options->correction_explanation_language)) {
279 client_remote->OnError(
280 blink::mojom::AIManagerCreateClientError::kUnsupportedLanguage,
281 /*quota_error_info=*/nullptr);
282 return;
283 }
284
285 CreateClient<blink::mojom::AIManagerCreateProofreaderClient,
286 blink::mojom::AIProofreader, EchoAIProofreader>(
287 std::move(client_remote));
288}
289
Mike Wasserman311bf8c2025-07-10 18:13:37290void EchoAIManagerImpl::AddModelDownloadProgressObserver(
291 mojo::PendingRemote<blink::mojom::ModelDownloadProgressObserver>
292 observer_remote) {
293 download_progress_observers_.Add(std::move(observer_remote));
294}
295
Queenie Zhangf78ea0f2025-06-17 18:03:50296template <typename CanCreateCallback>
297void EchoAIManagerImpl::CanCreateClient(CanCreateCallback callback) {
298 std::move(callback).Run(
Mike Wasserman311bf8c2025-07-10 18:13:37299 IsModelDownloadedForCurrentReciever()
Queenie Zhangf78ea0f2025-06-17 18:03:50300 ? blink::mojom::ModelAvailabilityCheckResult::kAvailable
301 : blink::mojom::ModelAvailabilityCheckResult::kDownloadable);
302}
303
304template <typename AIClientRemote,
305 typename AIPendingRemote,
306 typename EchoAIClient>
307void EchoAIManagerImpl::CreateClient(
308 mojo::Remote<AIClientRemote> client_remote) {
309 auto return_task =
310 base::BindOnce(&EchoAIManagerImpl::ReturnAIClientCreationResult<
311 AIClientRemote, AIPendingRemote, EchoAIClient>,
312 weak_ptr_factory_.GetWeakPtr(), std::move(client_remote));
Mike Wasserman311bf8c2025-07-10 18:13:37313 if (!IsModelDownloadedForCurrentReciever()) {
314 // Simulate downloading the model; cache state for the current receiver.
315 model_downloaded_receivers_.insert(receivers_.current_receiver());
Queenie Zhangf78ea0f2025-06-17 18:03:50316 content::GetUIThreadTaskRunner()->PostDelayedTask(
317 FROM_HERE,
318 base::BindOnce(&EchoAIManagerImpl::DoMockDownloadingAndReturn,
319 weak_ptr_factory_.GetWeakPtr(), std::move(return_task)),
320 base::Milliseconds(kMockDownloadPreparationTimeMillisecond));
321 } else {
322 std::move(return_task).Run();
323 }
324}
325
Daseul Leeafef8e822025-05-15 21:52:24326template <typename AICreateOptions, typename CanCreateCallback>
327void EchoAIManagerImpl::CanCreateWritingAssistanceClient(
328 AICreateOptions options,
329 CanCreateCallback callback) {
330 if (options && !SupportedLanguages(options->expected_input_languages,
331 options->expected_context_languages,
332 options->output_language)) {
333 std::move(callback).Run(blink::mojom::ModelAvailabilityCheckResult::
334 kUnavailableUnsupportedLanguage);
335 return;
336 }
Queenie Zhangf78ea0f2025-06-17 18:03:50337 CanCreateClient<CanCreateCallback>(std::move(callback));
Daseul Leeafef8e822025-05-15 21:52:24338}
339
340template <typename AICreateOptions,
341 typename AIClientRemote,
342 typename AIPendingRemote,
343 typename EchoAIClient>
344void EchoAIManagerImpl::CreateWritingAssistanceClient(
345 mojo::PendingRemote<AIClientRemote> client,
346 AICreateOptions options) {
347 mojo::Remote<AIClientRemote> client_remote(std::move(client));
348 if (options && !SupportedLanguages(options->expected_input_languages,
349 options->expected_context_languages,
350 options->output_language)) {
351 client_remote->OnError(
Daseul Lee644db352025-05-27 19:33:32352 blink::mojom::AIManagerCreateClientError::kUnsupportedLanguage,
353 /*quota_error_info=*/nullptr);
Daseul Leeafef8e822025-05-15 21:52:24354 return;
355 }
Queenie Zhangf78ea0f2025-06-17 18:03:50356
357 CreateClient<AIClientRemote, AIPendingRemote, EchoAIClient>(
358 std::move(client_remote));
Daseul Leeafef8e822025-05-15 21:52:24359}
360
361template <typename AIClientRemote,
362 typename AIPendingRemote,
363 typename EchoAIClient>
364void EchoAIManagerImpl::ReturnAIClientCreationResult(
365 mojo::Remote<AIClientRemote> client_remote) {
Daseul Leeafef8e822025-05-15 21:52:24366 mojo::PendingRemote<AIPendingRemote> pending_remote;
367 mojo::MakeSelfOwnedReceiver(std::make_unique<EchoAIClient>(),
368 pending_remote.InitWithNewPipeAndPassReceiver());
369 client_remote->OnResult(std::move(pending_remote));
Tsuyoshi Horo2e2bb012024-08-15 07:57:29370}
371
Mingyu Lei5299ac12024-11-13 02:06:15372void EchoAIManagerImpl::ReturnAILanguageModelCreationResult(
373 mojo::Remote<blink::mojom::AIManagerCreateLanguageModelClient>
Mingyu Lei82e02252025-02-25 16:23:27374 client_remote,
Brad Triebwassere163bfa2025-04-18 02:22:09375 blink::mojom::AILanguageModelSamplingParamsPtr sampling_params,
Brad Triebwasser666c7c82025-06-09 22:25:25376 base::flat_set<blink::mojom::AILanguageModelPromptType> enabled_input_types,
377 uint32_t initial_input_usage) {
Mingyu Lei5299ac12024-11-13 02:06:15378 mojo::PendingRemote<blink::mojom::AILanguageModel> language_model;
Mingyu Lei82e02252025-02-25 16:23:27379 auto model_sampling_params =
380 sampling_params
381 ? std::move(sampling_params)
382 : blink::mojom::AILanguageModelSamplingParams::New(
383 optimization_guide::features::GetOnDeviceModelDefaultTopK(),
384 optimization_guide::features::
385 GetOnDeviceModelDefaultTemperature());
386
Brad Triebwasser666c7c82025-06-09 22:25:25387 mojo::MakeSelfOwnedReceiver(std::make_unique<EchoAILanguageModel>(
388 model_sampling_params->Clone(),
389 enabled_input_types, initial_input_usage),
390 language_model.InitWithNewPipeAndPassReceiver());
Mike Wasserman16b5ba72025-03-24 21:17:09391 client_remote->OnResult(
392 std::move(language_model),
393 blink::mojom::AILanguageModelInstanceInfo::New(
Brad Triebwasser666c7c82025-06-09 22:25:25394 kMaxContextSizeInTokens, initial_input_usage,
395 std::move(model_sampling_params),
Brad Triebwassere163bfa2025-04-18 02:22:09396 std::vector<blink::mojom::AILanguageModelPromptType>(
397 enabled_input_types.begin(), enabled_input_types.end())));
Mingyu Lei4c04e112024-10-25 04:36:44398}
399
Jiacheng Guo50379cb2024-12-09 06:10:43400void EchoAIManagerImpl::DoMockDownloadingAndReturn(base::OnceClosure callback) {
Mingyu Lei4c04e112024-10-25 04:36:44401 // Mock the downloading process update for testing.
Mingyu Lei7bc64b42024-10-25 05:31:00402 for (auto& observer : download_progress_observers_) {
Mike Wasserman4f6508372025-04-01 18:34:35403 observer->OnDownloadProgressUpdate(0, kMockModelSizeBytes);
Mingyu Lei7bc64b42024-10-25 05:31:00404 observer->OnDownloadProgressUpdate(kMockModelSizeBytes / 3,
405 kMockModelSizeBytes);
406 observer->OnDownloadProgressUpdate(kMockModelSizeBytes / 3 * 2,
407 kMockModelSizeBytes);
408 observer->OnDownloadProgressUpdate(kMockModelSizeBytes,
409 kMockModelSizeBytes);
Mingyu Lei4c04e112024-10-25 04:36:44410 }
411
Jiacheng Guo50379cb2024-12-09 06:10:43412 std::move(callback).Run();
Mingyu Lei4c04e112024-10-25 04:36:44413}
414
Mike Wasserman311bf8c2025-07-10 18:13:37415bool EchoAIManagerImpl::IsModelDownloadedForCurrentReciever() const {
416 return model_downloaded_receivers_.contains(receivers_.current_receiver());
Mingyu Lei4c04e112024-10-25 04:36:44417}
418
Mingyu Lei65f1a30b2024-05-29 06:21:47419} // namespace content