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);
141 std::string BuildApiUrl(
const std::string& endpoint)
const;
149 std::string BuildRequestBody(
const std::string& prompt,
150 bool include_system =
true)
const;
159 std::string BuildMultimodalRequestBody(
const std::string& prompt,
160 const std::string& image_data,
161 const std::string& mime_type)
const;
166 std::string BuildOpenAIRequestBody(
167 const std::string& prompt,
168 const std::vector<agent::ChatMessage>* history =
nullptr)
const;
175 absl::StatusOr<AgentResponse> ParseGeminiResponse(
176 const std::string& response_body)
const;
181 absl::StatusOr<AgentResponse> ParseOpenAIResponse(
182 const std::string& response_body)
const;
189 std::string ExtractTextFromCandidates(
const nlohmann::json& json)
const;
196 absl::Status CheckForApiError(
const nlohmann::json& json)
const;
202 void LogDebug(
const std::string& message)
const;
205 BrowserAIConfig config_;
208 std::unique_ptr<net::IHttpClient> http_client_;
214 static constexpr const char* kGeminiApiBaseUrl =
215 "https://generativelanguage.googleapis.com/v1beta/models/";
216 static constexpr const char* kOpenAIApiBaseUrl =
217 "https://api.openai.com/v1";
220 mutable std::mutex mutex_;