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"
16#include "nlohmann/json.hpp"
32struct BrowserAIConfig {
34 std::string provider =
"gemini";
38 std::string model =
"gemini-2.5-flash";
43 float temperature = 0.7f;
44 int max_output_tokens = 2048;
45 std::string system_instruction;
47 int timeout_seconds = 30;
65class BrowserAIService :
public AIService {
72 explicit BrowserAIService(
const BrowserAIConfig& config,
73 std::unique_ptr<net::IHttpClient> http_client);
78 ~BrowserAIService()
override =
default;
84 void SetRomContext(Rom* rom)
override;
91 absl::StatusOr<AgentResponse> GenerateResponse(
92 const std::string& prompt)
override;
99 absl::StatusOr<AgentResponse> GenerateResponse(
100 const std::vector<agent::ChatMessage>& history)
override;
106 absl::StatusOr<std::vector<ModelInfo>> ListAvailableModels()
override;
112 std::string GetProviderName()
const override {
return config_.provider; }
120 absl::StatusOr<AgentResponse> AnalyzeImage(
const std::string& image_data,
121 const std::string& prompt);
127 absl::Status CheckAvailability();
133 void UpdateApiKey(
const std::string& api_key);
136 bool RequiresApiKey()
const;
137 std::string GetOpenAIApiBase()
const;
144 std::string BuildApiUrl(
const std::string& endpoint)
const;
152 std::string BuildRequestBody(
const std::string& prompt,
153 bool include_system =
true)
const;
162 std::string BuildMultimodalRequestBody(
const std::string& prompt,
163 const std::string& image_data,
164 const std::string& mime_type)
const;
169 std::string BuildOpenAIRequestBody(
170 const std::string& prompt,
171 const std::vector<agent::ChatMessage>* history =
nullptr)
const;
178 absl::StatusOr<AgentResponse> ParseGeminiResponse(
179 const std::string& response_body)
const;
184 absl::StatusOr<AgentResponse> ParseOpenAIResponse(
185 const std::string& response_body)
const;
192 std::string ExtractTextFromCandidates(
const nlohmann::json& json)
const;
199 absl::Status CheckForApiError(
const nlohmann::json& json)
const;
205 void LogDebug(
const std::string& message)
const;
208 BrowserAIConfig config_;
211 std::unique_ptr<net::IHttpClient> http_client_;
217 static constexpr const char* kGeminiApiBaseUrl =
218 "https://generativelanguage.googleapis.com/v1beta/models/";
219 static constexpr const char* kOpenAIApiBaseUrl =
220 "https://api.openai.com/v1";
223 mutable std::mutex mutex_;