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"
17#include "nlohmann/json.hpp"
18
19namespace yaze {
20
21class Rom;
22
23namespace cli {
24
25namespace agent {
26struct ChatMessage;
27}
28
33struct BrowserAIConfig {
34 // Provider selector: kProviderGemini by default; OpenAI-compatible browser
35 // providers preserve their ids (openai, lmstudio, halext, afs-bridge).
36 std::string provider = kProviderGemini;
37
38 // API keys (provider-specific)
39 std::string api_key; // Gemini/OpenAI API key
40 std::string model = "gemini-2.5-flash"; // Default to latest flash model
41
42 // Optional custom endpoints (leave empty for defaults)
43 std::string api_base; // e.g., "https://api.openai.com/v1"
44
45 float temperature = 0.7f;
46 int max_output_tokens = 2048;
47 std::string system_instruction; // System prompt
48 bool verbose = false; // Enable debug logging
49 int timeout_seconds = 30; // Request timeout
50};
51
67class BrowserAIService : public AIService {
68 public:
74 explicit BrowserAIService(const BrowserAIConfig& config,
75 std::unique_ptr<net::IHttpClient> http_client);
76
80 ~BrowserAIService() override = default;
81
86 void SetRomContext(Rom* rom) override;
87
93 absl::StatusOr<AgentResponse> GenerateResponse(
94 const std::string& prompt) override;
95
101 absl::StatusOr<AgentResponse> GenerateResponse(
102 const std::vector<agent::ChatMessage>& history) override;
103
108 absl::StatusOr<std::vector<ModelInfo>> ListAvailableModels() override;
109
114 std::string GetProviderName() const override { return config_.provider; }
115
122 absl::StatusOr<AgentResponse> AnalyzeImage(const std::string& image_data,
123 const std::string& prompt);
124
129 absl::Status CheckAvailability();
130
135 void UpdateApiKey(const std::string& api_key);
136
137 private:
138 bool RequiresApiKey() const;
139 std::string GetOpenAIApiBase() const;
140
146 std::string BuildApiUrl(const std::string& endpoint) const;
147
154 std::string BuildRequestBody(const std::string& prompt,
155 bool include_system = true) const;
156
164 std::string BuildMultimodalRequestBody(const std::string& prompt,
165 const std::string& image_data,
166 const std::string& mime_type) const;
167
171 std::string BuildOpenAIRequestBody(
172 const std::string& prompt,
173 const std::vector<agent::ChatMessage>* history = nullptr) const;
174
180 absl::StatusOr<AgentResponse> ParseGeminiResponse(
181 const std::string& response_body) const;
182
186 absl::StatusOr<AgentResponse> ParseOpenAIResponse(
187 const std::string& response_body) const;
188
194 std::string ExtractTextFromCandidates(const nlohmann::json& json) const;
195
201 absl::Status CheckForApiError(const nlohmann::json& json) const;
202
207 void LogDebug(const std::string& message) const;
208
209 // Configuration
210 BrowserAIConfig config_;
211 std::string base_system_instruction_;
212
213 // HTTP client for API requests
214 std::unique_ptr<net::IHttpClient> http_client_;
215
216 // ROM context (not owned)
217 Rom* rom_ = nullptr;
218
219 // Gemini API base URL
220 static constexpr const char* kGeminiApiBaseUrl =
221 "https://generativelanguage.googleapis.com/v1beta/models/";
222 static constexpr const char* kOpenAIApiBaseUrl = "https://api.openai.com/v1";
223
224 // Mutex for thread safety
225 mutable std::mutex mutex_;
226};
227
228} // namespace cli
229} // namespace yaze
230
231#endif // __EMSCRIPTEN__
232
233#endif // YAZE_SRC_CLI_SERVICE_AI_BROWSER_AI_SERVICE_H_
constexpr char kProviderGemini[]
Definition provider_ids.h:9