6#include "absl/flags/declare.h"
7#include "absl/flags/flag.h"
8#include "absl/strings/ascii.h"
9#include "absl/strings/match.h"
28 if (!absl::EndsWith(base,
"/v1")) {
35 if (rom_path.empty()) {
38 const std::string lowered = absl::AsciiStrToLower(std::string(rom_path));
39 return absl::StrContains(lowered,
"oracle") ||
40 absl::StrContains(lowered,
"oos");
44 provider = absl::AsciiStrToLower(std::move(provider));
77 if (!asset_path.ok()) {
80 std::ifstream file(asset_path->string());
84 return std::string(std::istreambuf_iterator<char>(file),
85 std::istreambuf_iterator<char>());
108 std::unique_ptr<yaze::cli::AIService> service,
110 if (service !=
nullptr && config.
rom_context !=
nullptr) {
132 AIServiceConfig config;
133 config.
provider = ::absl::GetFlag(FLAGS_ai_provider);
134 config.model = ::absl::GetFlag(FLAGS_ai_model);
135 config.gemini_api_key = ::absl::GetFlag(FLAGS_gemini_api_key);
136 config.openai_base_url = ::absl::GetFlag(FLAGS_openai_base_url);
137 config.rom_path_hint = ::absl::GetFlag(FLAGS_rom);
138 return NormalizeConfig(std::move(config));
142 if (config.rom_context !=
nullptr &&
152 const AIServiceConfig& base_config) {
154 if (config.provider.empty() || config.provider ==
kProviderAuto) {
165 if (config.provider.empty() || config.provider ==
kProviderAuto) {
168 if (config.model.empty()) {
169 config.model =
"gemini-2.5-flash";
174std::unique_ptr<AIService>
CreateAIService(
const AIServiceConfig& config) {
176 if (effective_config.provider.empty() ||
182 if (service_or.ok()) {
183 return std::move(service_or.value());
186 return FinalizeService(std::make_unique<MockAIService>(), effective_config);
190 const AIServiceConfig& config) {
192 if (effective_config.provider.empty() ||
194 return absl::InvalidArgumentError(
195 "CreateAIServiceStrict requires an explicit provider (not 'auto')");
199 return FinalizeService(std::make_unique<MockAIService>(), effective_config);
203 return absl::FailedPreconditionError(
204 absl::StrFormat(
"Provider '%s' is not supported in the browser build",
205 effective_config.provider));
208 BrowserAIConfig browser_config;
209 browser_config.provider = effective_config.provider;
210 browser_config.model = effective_config.model;
211 browser_config.system_instruction =
214 browser_config.api_key = effective_config.openai_api_key;
215 browser_config.api_base =
216 effective_config.openai_base_url.empty()
220 browser_config.api_key = effective_config.gemini_api_key;
222 browser_config.verbose = effective_config.verbose;
225 auto http_client = std::make_unique<net::EmscriptenHttpClient>();
227 std::unique_ptr<net::IHttpClient> http_client =
nullptr;
231 browser_config, std::move(http_client)),
yaze::cli::AIServiceConfig NormalizeConfig(yaze::cli::AIServiceConfig config)
std::unique_ptr< yaze::cli::AIService > FinalizeService(std::unique_ptr< yaze::cli::AIService > service, const yaze::cli::AIServiceConfig &config)
bool IsLikelyOracleRomPath(absl::string_view rom_path)
std::string ResolveOracleSystemInstruction(const yaze::cli::AIServiceConfig &config)
bool IsBrowserSupportedProvider(absl::string_view provider)
std::string NormalizeBrowserProviderAlias(std::string provider)
constexpr char kDefaultOpenAiBaseUrl[]
std::string NormalizeOpenAIApiBase(std::string base)
bool IsOpenAiCompatibleProvider(absl::string_view provider)
std::string ReadAssetFile(absl::string_view relative_path)
constexpr char kOraclePromptAsset[]
std::string ResolveOracleSystemInstruction(const yaze::cli::AIServiceConfig &config)
yaze::cli::AIServiceConfig NormalizeConfig(yaze::cli::AIServiceConfig config)
bool IsLikelyOracleRomPath(absl::string_view rom_path)
std::unique_ptr< yaze::cli::AIService > FinalizeService(std::unique_ptr< yaze::cli::AIService > service, const yaze::cli::AIServiceConfig &config)
constexpr char kProviderGemini[]
constexpr char kProviderGpt[]
constexpr char kProviderGoogle[]
constexpr char kProviderCustomOpenAi[]
std::unique_ptr< AIService > CreateAIService()
AgentPromptProfile DetectPromptProfile(const AIServiceConfig &config)
absl::StatusOr< std::unique_ptr< AIService > > CreateAIServiceStrict(const AIServiceConfig &config)
constexpr char kProviderAuto[]
constexpr char kProviderChatGpt[]
AIServiceConfig BuildAIServiceConfigFromFlags()
std::string NormalizeOpenAiBaseUrl(std::string base)
constexpr char kProviderHalext[]
constexpr char kProviderGoogleGemini[]
constexpr char kProviderMock[]
constexpr char kProviderOpenAiCompatible[]
constexpr char kProviderAfsBridge[]
std::vector< AIServiceConfig > DiscoverModelRegistryConfigs(const AIServiceConfig &base_config)
constexpr char kProviderLmStudioDashed[]
constexpr char kProviderOpenAi[]
constexpr char kProviderLmStudio[]
constexpr char kDefaultOpenAiBaseUrl[]
ABSL_DECLARE_FLAG(std::string, ai_provider)
std::string openai_base_url