blob: c333c1ebff7f24ffed2fe19804fd8f2e03b80b76 [file] [log] [blame]
// 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_CREATE_ON_DEVICE_SESSION_TASK_H_
#define CHROME_BROWSER_AI_AI_CREATE_ON_DEVICE_SESSION_TASK_H_
#include "base/memory/raw_ptr.h"
#include "base/state_transitions.h"
#include "chrome/browser/ai/ai_context_bound_object.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
#include "components/optimization_guide/core/optimization_guide_model_executor.h"
#include "services/on_device_model/public/cpp/capabilities.h"
// A base class for tasks which create an on-device session.
class CreateOnDeviceSessionTask
: public AIContextBoundObject,
public optimization_guide::OnDeviceModelAvailabilityObserver {
public:
CreateOnDeviceSessionTask(
AIContextBoundObjectSet& context_bound_object_set,
content::BrowserContext* browser_context,
optimization_guide::ModelBasedCapabilityKey feature);
~CreateOnDeviceSessionTask() override;
CreateOnDeviceSessionTask(const CreateOnDeviceSessionTask&) = delete;
CreateOnDeviceSessionTask& operator=(const CreateOnDeviceSessionTask&) =
delete;
bool IsPending() const { return state_ == State::kPending; }
// Starts the process of creating an on-device model session.
// It may succeed or fail immediately, or it may move into the `kPending`
// state if it needs to wait for the on-device model availability changes.
// See `kWaitableReasons` for more details.
void Start();
protected:
// Cancels the creation task, and deletes itself.
void Cancel();
virtual void OnFinish(
std::unique_ptr<
optimization_guide::OptimizationGuideModelExecutor::Session>
session) = 0;
virtual void UpdateSessionConfigParams(
optimization_guide::SessionConfigParams* config_params) {}
private:
// The state of `CreateOnDeviceSessionTask`.
// The possible transitions of state are:
// - kNotStarted -> kFinished
// - kNotStarted -> kPending
// - kPending -> kFinished
// - kPending -> kCancelled
enum class State {
// The task is created but not started yet.
kNotStarted,
// The task has started, but the on-device model is not readily available
// and is expected to be ready soon.
// When the task is in `kPending` state, it should be kept alive by the
// creator as it needs to keep observing the on-device model availability
// changes.
// See `kWaitableReasons` for more details.
kPending,
// The task is finished, but it's not guaranteed that the session has been
// created successfully.
kFinished,
// The task is cancelled before finishing.
kCancelled,
};
friend base::StateTransitions<State>;
friend std::ostream& operator<<(std::ostream& os, State state);
void SetState(State state);
// optimization_guide::OnDeviceModelAvailabilityObserver
void OnDeviceModelAvailabilityChanged(
optimization_guide::ModelBasedCapabilityKey feature,
optimization_guide::OnDeviceModelEligibilityReason reason) override;
void OnGetEligibility(
optimization_guide::OnDeviceModelEligibilityReason eligibility);
std::unique_ptr<optimization_guide::OptimizationGuideModelExecutor::Session>
StartSession();
void Finish(
std::unique_ptr<
optimization_guide::OptimizationGuideModelExecutor::Session> session);
OptimizationGuideKeyedService* GetOptimizationGuideService();
const raw_ptr<content::BrowserContext> browser_context_;
const optimization_guide::ModelBasedCapabilityKey feature_;
State state_ = CreateOnDeviceSessionTask::State::kNotStarted;
base::WeakPtrFactory<CreateOnDeviceSessionTask> weak_factory_{this};
};
#endif // CHROME_BROWSER_AI_AI_CREATE_ON_DEVICE_SESSION_TASK_H_