9#include "absl/strings/str_cat.h"
27 const std::string provider = config.
provider;
30 return std::static_pointer_cast<yaze::cli::AIService>(
31 std::make_shared<yaze::cli::MockAIService>());
37 if (!config.
model.empty()) {
40 return std::static_pointer_cast<yaze::cli::AIService>(
41 std::make_shared<yaze::cli::OllamaAIService>(ollama_config));
46 return std::static_pointer_cast<yaze::cli::AIService>(
47 std::make_shared<yaze::cli::LocalGeminiCliService>(
48 config.
model.empty() ?
"gemini-2.5-flash" : config.
model));
54 if (!config.
model.empty()) {
58 return std::static_pointer_cast<yaze::cli::AIService>(
59 std::make_shared<yaze::cli::GeminiAIService>(gemini_config));
63 if (!config.
model.empty()) {
67 return std::static_pointer_cast<yaze::cli::AIService>(
68 std::make_shared<yaze::cli::AnthropicAIService>(anthropic_config));
73 if (!config.
model.empty()) {
77 return std::static_pointer_cast<yaze::cli::AIService>(
78 std::make_shared<yaze::cli::OpenAIAIService>(openai_config));
82 return absl::InvalidArgumentError(
83 absl::StrCat(
"Unsupported model discovery provider: ", provider));
97 std::lock_guard<std::mutex> lock(
mutex_);
104 std::lock_guard<std::mutex> lock(
mutex_);
116 for (
const auto& config :
118 auto service_or = CreateDiscoveryService(config);
119 if (!service_or.ok()) {
122 auto service = std::move(service_or.value());
123 if (config.rom_context !=
nullptr) {
124 service->SetRomContext(config.rom_context);
137 bool force_refresh) {
138 std::lock_guard<std::mutex> lock(
mutex_);
141 const auto now = std::chrono::steady_clock::now();
146 std::vector<ModelInfo> all_models;
149 auto models_or = service->ListAvailableModels();
150 if (models_or.ok()) {
151 auto& models = *models_or;
152 all_models.insert(all_models.end(),
153 std::make_move_iterator(models.begin()),
154 std::make_move_iterator(models.end()));
159 all_models.begin(), all_models.end(),
162 for (
auto& model : all_models) {
163 if (model.display_name.empty()) {
164 model.display_name = model.name;
static ModelRegistry & GetInstance()
bool auto_discovery_attempted_
void RegisterService(std::shared_ptr< AIService > service)
std::vector< ModelInfo > cached_models_
std::chrono::steady_clock::time_point cache_timestamp_
void EnsureDiscoveredServicesLocked()
absl::StatusOr< std::vector< ModelInfo > > ListAllModels(bool force_refresh=false)
void InvalidateCacheLocked()
std::vector< std::shared_ptr< AIService > > services_
absl::StatusOr< std::shared_ptr< yaze::cli::AIService > > CreateDiscoveryService(const yaze::cli::AIServiceConfig &config)
constexpr std::chrono::seconds kModelCacheTtl(30)
constexpr char kProviderGemini[]
constexpr char kProviderAnthropic[]
constexpr char kProviderGeminiCli[]
AIServiceConfig BuildAIServiceConfigFromFlags()
constexpr char kProviderMock[]
constexpr char kProviderLocalGemini[]
std::vector< AIServiceConfig > DiscoverModelRegistryConfigs(const AIServiceConfig &base_config)
constexpr char kProviderOpenAi[]
constexpr char kProviderOllama[]
std::string gemini_api_key
std::string openai_base_url
std::string anthropic_api_key
std::string openai_api_key