yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
browser_ai_service.h
Go to the documentation of this file.
1#ifndef YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_
2#define YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_
3
4#ifdef __EMSCRIPTEN__
5
6#include <memory>
7#include <mutex>
8#include <string>
9#include <vector>
10
11#include "absl/status/status.h"
12#include "absl/status/statusor.h"
13#include "app/net/http_client.h"
16#include "nlohmann/json.hpp"
17
18namespace yaze {
19
20class Rom;
21
22namespace cli {
23
24namespace agent {
25struct ChatMessage;
26}
27
32struct BrowserAIConfig {
33 // Provider selector: "gemini" (default) or "openai"
34 std::string provider = "gemini";
35
36 // API keys (provider-specific)
37 std::string api_key; // Gemini/OpenAI API key
38 std::string model = "gemini-2.5-flash"; // Default to latest flash model
39
40 // Optional custom endpoints (leave empty for defaults)
41 std::string api_base; // e.g., "https://api.openai.com/v1"
42
43 float temperature = 0.7f;
44 int max_output_tokens = 2048;
45 std::string system_instruction; // System prompt
46 bool verbose = false; // Enable debug logging
47 int timeout_seconds = 30; // Request timeout
48};
49
65class BrowserAIService : public AIService {
66 public:
72 explicit BrowserAIService(const BrowserAIConfig& config,
73 std::unique_ptr<net::IHttpClient> http_client);
74
78 ~BrowserAIService() override = default;
79
84 void SetRomContext(Rom* rom) override;
85
91 absl::StatusOr<AgentResponse> GenerateResponse(
92 const std::string& prompt) override;
93
99 absl::StatusOr<AgentResponse> GenerateResponse(
100 const std::vector<agent::ChatMessage>& history) override;
101
106 absl::StatusOr<std::vector<ModelInfo>> ListAvailableModels() override;
107
112 std::string GetProviderName() const override { return config_.provider; }
113
120 absl::StatusOr<AgentResponse> AnalyzeImage(const std::string& image_data,
121 const std::string& prompt);
122
127 absl::Status CheckAvailability();
128
133 void UpdateApiKey(const std::string& api_key);
134
135 private:
141 std::string BuildApiUrl(const std::string& endpoint) const;
142
149 std::string BuildRequestBody(const std::string& prompt,
150 bool include_system = true) const;
151
159 std::string BuildMultimodalRequestBody(const std::string& prompt,
160 const std::string& image_data,
161 const std::string& mime_type) const;
162
166 std::string BuildOpenAIRequestBody(
167 const std::string& prompt,
168 const std::vector<agent::ChatMessage>* history = nullptr) const;
169
175 absl::StatusOr<AgentResponse> ParseGeminiResponse(
176 const std::string& response_body) const;
177
181 absl::StatusOr<AgentResponse> ParseOpenAIResponse(
182 const std::string& response_body) const;
183
189 std::string ExtractTextFromCandidates(const nlohmann::json& json) const;
190
196 absl::Status CheckForApiError(const nlohmann::json& json) const;
197
202 void LogDebug(const std::string& message) const;
203
204 // Configuration
205 BrowserAIConfig config_;
206
207 // HTTP client for API requests
208 std::unique_ptr<net::IHttpClient> http_client_;
209
210 // ROM context (not owned)
211 Rom* rom_ = nullptr;
212
213 // Gemini API base URL
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";
218
219 // Mutex for thread safety
220 mutable std::mutex mutex_;
221};
222
223} // namespace cli
224} // namespace yaze
225
226#endif // __EMSCRIPTEN__
227
228#endif // YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_