1#ifndef YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_
2#define YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
17#include "nlohmann/json.hpp"
33struct BrowserAIConfig {
40 std::string model =
"gemini-2.5-flash";
45 float temperature = 0.7f;
46 int max_output_tokens = 2048;
47 std::string system_instruction;
49 int timeout_seconds = 30;
67class BrowserAIService :
public AIService {
74 explicit BrowserAIService(
const BrowserAIConfig& config,
75 std::unique_ptr<net::IHttpClient> http_client);
80 ~BrowserAIService()
override =
default;
86 void SetRomContext(Rom* rom)
override;
93 absl::StatusOr<AgentResponse> GenerateResponse(
94 const std::string& prompt)
override;
101 absl::StatusOr<AgentResponse> GenerateResponse(
102 const std::vector<agent::ChatMessage>& history)
override;
108 absl::StatusOr<std::vector<ModelInfo>> ListAvailableModels()
override;
114 std::string GetProviderName()
const override {
return config_.provider; }
122 absl::StatusOr<AgentResponse> AnalyzeImage(
const std::string& image_data,
123 const std::string& prompt);
129 absl::Status CheckAvailability();
135 void UpdateApiKey(
const std::string& api_key);
138 bool RequiresApiKey()
const;
139 std::string GetOpenAIApiBase()
const;
146 std::string BuildApiUrl(
const std::string& endpoint)
const;
154 std::string BuildRequestBody(
const std::string& prompt,
155 bool include_system =
true)
const;
164 std::string BuildMultimodalRequestBody(
const std::string& prompt,
165 const std::string& image_data,
166 const std::string& mime_type)
const;
171 std::string BuildOpenAIRequestBody(
172 const std::string& prompt,
173 const std::vector<agent::ChatMessage>* history =
nullptr)
const;
180 absl::StatusOr<AgentResponse> ParseGeminiResponse(
181 const std::string& response_body)
const;
186 absl::StatusOr<AgentResponse> ParseOpenAIResponse(
187 const std::string& response_body)
const;
194 std::string ExtractTextFromCandidates(
const nlohmann::json& json)
const;
201 absl::Status CheckForApiError(
const nlohmann::json& json)
const;
207 void LogDebug(
const std::string& message)
const;
210 BrowserAIConfig config_;
211 std::string base_system_instruction_;
214 std::unique_ptr<net::IHttpClient> http_client_;
220 static constexpr const char* kGeminiApiBaseUrl =
221 "https://generativelanguage.googleapis.com/v1beta/models/";
222 static constexpr const char* kOpenAIApiBaseUrl =
"https://api.openai.com/v1";
225 mutable std::mutex mutex_;
constexpr char kProviderGemini[]