File: ai_data_keyed_service.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (153 lines) | stat: -rw-r--r-- 6,136 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_BROWSER_AI_AI_DATA_KEYED_SERVICE_H_
#define CHROME_BROWSER_AI_AI_DATA_KEYED_SERVICE_H_

#include <optional>
#include <string>
#include <vector>

#include "base/feature_list.h"
#include "base/functional/callback.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "chrome/common/buildflags.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/optimization_guide/proto/features/actions_data.pb.h"
#include "components/optimization_guide/proto/features/model_prototyping.pb.h"

#if BUILDFLAG(ENABLE_GLIC)
#include "chrome/browser/actor/actor_coordinator.h"
#include "chrome/browser/glic/host/context/glic_page_context_fetcher.h"
#include "chrome/common/actor.mojom-forward.h"
#endif

namespace content {
class WebContents;
class BrowserContext;
}  // namespace content

// Browser service to collect AI data, including data resulting from triggering
// actor tasks.
class AiDataKeyedService : public KeyedService {
 public:
  // Data related to AiData collection.
  using BrowserData = optimization_guide::proto::BrowserCollectedInformation;
  using AiData = std::optional<BrowserData>;
  using AiDataCallback = base::OnceCallback<void(AiData)>;
  using AiDataSpecifier =
      optimization_guide::proto::ModelPrototypingCollectionSpecifier;

  explicit AiDataKeyedService(content::BrowserContext* browser_context);
  AiDataKeyedService(const AiDataKeyedService&) = delete;
  AiDataKeyedService& operator=(const AiDataKeyedService&) = delete;
  ~AiDataKeyedService() override;

  // Returns the list of extensions that are allowlisted for data collection.
  static bool IsExtensionAllowlistedForData(const std::string& extension_id);

  // Returns the list of extensions that are allowlisted for actions.
  static bool IsExtensionAllowlistedForActions(const std::string& extension_id);

  // Returns whether an extension is allowed to run on stable channel.
  static bool IsExtensionAllowlistedForStable(const std::string& extension_id);

  // Fills an AiData and returns the result via the passed in callback. If the
  // AiData is empty, data collection failed. |callback| is guaranteed to be
  // called, and guaranteed to be called asynchronously. This method uses a set
  // of default specifiers. See |GetAiDataWithSpecifiers| for more details.
  void GetAiData(int dom_node_id,
                 content::WebContents* web_contents,
                 std::string user_input,
                 AiDataCallback callback,
                 int tabs_for_inner_text = 10);

  // Fills an AiData and returns the result via the passed in callback. If the
  // AiData is empty, data collection failed. |callback| is guaranteed to be
  // called, and guaranteed to be called asynchronously.
  // |tabs_for_inner_text|: The number of tabs to collect inner text for.
  void GetAiDataWithSpecifier(content::WebContents* web_contents,
                              AiDataSpecifier specifier,
                              AiDataCallback callback);

  // Starts an actor task.
  void StartTask(
      optimization_guide::proto::BrowserStartTask task,
      base::OnceCallback<
          void(optimization_guide::proto::BrowserStartTaskResult)> callback);

  // Stops an actor task.
  void StopTask(int64_t task_id, base::OnceCallback<void(bool)> callback);

  // Executes an actor action. The first action in a task must be navigate.
  void ExecuteAction(
      optimization_guide::proto::BrowserAction action,
      base::OnceCallback<void(optimization_guide::proto::BrowserActionResult)>
          callback);

  // Returns true if the associated ActorCoordinator is active on the given
  // `tab`. This can be used by callers to customize certain behaviour that
  // might interfere with the ActorCoordinator.
  bool IsActorCoordinatorActingOnTab(const content::WebContents* tab) const;

  static const base::Feature& GetAllowlistedAiDataExtensionsFeatureForTesting();
  static const base::Feature&
  GetAllowlistedActionsExtensionsFeatureForTesting();

 private:
#if BUILDFLAG(ENABLE_GLIC)
  // Called when the actor coordinator has created a new tab for the task.
  void TaskCreated(
      base::OnceCallback<void(optimization_guide::proto::BrowserActionResult)>
          callback,
      optimization_guide::proto::BrowserAction action,
      int task_id,
      int tab_id,
      base::WeakPtr<tabs::TabInterface>);
  // Converts the result of a page context fetch to a BrowserActionResult.
  void ConvertToBrowserActionResult(
      base::OnceCallback<void(optimization_guide::proto::BrowserActionResult)>
          callback,
      int task_id,
      int tab_id,
      actor::mojom::ActionResultPtr action_result,
      glic::mojom::GetContextResultPtr result);
  // Called when the actor coordinator has started a tas.
  void OnTaskCreated(
      base::OnceCallback<
          void(optimization_guide::proto::BrowserStartTaskResult)> callback,
      int task_id,
      int tab_id,
      base::WeakPtr<tabs::TabInterface> tab);
  // Called when the actor coordinator has finished an action which required
  // task creation.
  void OnActionFinished(
      base::OnceCallback<void(optimization_guide::proto::BrowserActionResult)>
          callback,
      int task_id,
      int tab_id,
      actor::mojom::ActionResultPtr action_result);
  // The actor coordinator which manages task and action routing.
  std::unique_ptr<actor::ActorCoordinator> actor_coordinator_;

  // Whether the task still needs a navigate action to be executed as the
  // first action in the task.
  bool task_needs_navigate_ = false;

  // The tab that the task is running on.
  base::WeakPtr<tabs::TabInterface> tab_;

  // The tab id and task id of the current task.
  int tab_id_ = 1;
  int task_id_ = 1;
#endif

  // A `KeyedService` should never outlive the `BrowserContext`.
  raw_ptr<content::BrowserContext> browser_context_;

  base::WeakPtrFactory<AiDataKeyedService> weak_factory_{this};
};

#endif  // CHROME_BROWSER_AI_AI_DATA_KEYED_SERVICE_H_