yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
model_registry.cc
Go to the documentation of this file.
2
3#include <algorithm>
4#include <chrono>
5#include <memory>
6#include <string>
7#include <utility>
8
9#include "absl/strings/str_cat.h"
14
15#ifdef YAZE_WITH_JSON
19#endif
20
21namespace {
22
23constexpr std::chrono::seconds kModelCacheTtl(30);
24
25absl::StatusOr<std::shared_ptr<yaze::cli::AIService>> CreateDiscoveryService(
26 const yaze::cli::AIServiceConfig& config) {
27 const std::string provider = config.provider;
28
29 if (provider == yaze::cli::kProviderMock) {
30 return std::static_pointer_cast<yaze::cli::AIService>(
31 std::make_shared<yaze::cli::MockAIService>());
32 }
33
34 if (provider == yaze::cli::kProviderOllama) {
35 yaze::cli::OllamaConfig ollama_config;
36 ollama_config.base_url = config.ollama_host;
37 if (!config.model.empty()) {
38 ollama_config.model = config.model;
39 }
40 return std::static_pointer_cast<yaze::cli::AIService>(
41 std::make_shared<yaze::cli::OllamaAIService>(ollama_config));
42 }
43
44 if (provider == yaze::cli::kProviderGeminiCli ||
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));
49 }
50
51#ifdef YAZE_WITH_JSON
52 if (provider == yaze::cli::kProviderGemini) {
53 yaze::cli::GeminiConfig gemini_config(config.gemini_api_key);
54 if (!config.model.empty()) {
55 gemini_config.model = config.model;
56 }
57 gemini_config.verbose = config.verbose;
58 return std::static_pointer_cast<yaze::cli::AIService>(
59 std::make_shared<yaze::cli::GeminiAIService>(gemini_config));
60 }
61 if (provider == yaze::cli::kProviderAnthropic) {
62 yaze::cli::AnthropicConfig anthropic_config(config.anthropic_api_key);
63 if (!config.model.empty()) {
64 anthropic_config.model = config.model;
65 }
66 anthropic_config.verbose = config.verbose;
67 return std::static_pointer_cast<yaze::cli::AIService>(
68 std::make_shared<yaze::cli::AnthropicAIService>(anthropic_config));
69 }
70 if (provider == yaze::cli::kProviderOpenAi) {
71 yaze::cli::OpenAIConfig openai_config(config.openai_api_key);
72 openai_config.base_url = config.openai_base_url;
73 if (!config.model.empty()) {
74 openai_config.model = config.model;
75 }
76 openai_config.verbose = config.verbose;
77 return std::static_pointer_cast<yaze::cli::AIService>(
78 std::make_shared<yaze::cli::OpenAIAIService>(openai_config));
79 }
80#endif
81
82 return absl::InvalidArgumentError(
83 absl::StrCat("Unsupported model discovery provider: ", provider));
84}
85
86} // namespace
87
88namespace yaze {
89namespace cli {
90
92 static ModelRegistry instance;
93 return instance;
94}
95
96void ModelRegistry::RegisterService(std::shared_ptr<AIService> service) {
97 std::lock_guard<std::mutex> lock(mutex_);
99 services_.push_back(std::move(service));
101}
102
104 std::lock_guard<std::mutex> lock(mutex_);
105 services_.clear();
108}
109
111 if (auto_discovery_attempted_ || !services_.empty()) {
112 return;
113 }
114
116 for (const auto& config :
118 auto service_or = CreateDiscoveryService(config);
119 if (!service_or.ok()) {
120 continue;
121 }
122 auto service = std::move(service_or.value());
123 if (config.rom_context != nullptr) {
124 service->SetRomContext(config.rom_context);
125 }
126 services_.push_back(std::move(service));
127 }
129}
130
135
136absl::StatusOr<std::vector<ModelInfo>> ModelRegistry::ListAllModels(
137 bool force_refresh) {
138 std::lock_guard<std::mutex> lock(mutex_);
140
141 const auto now = std::chrono::steady_clock::now();
142 if (!force_refresh && cache_valid_ &&
143 (now - cache_timestamp_) < kModelCacheTtl) {
144 return cached_models_;
145 }
146 std::vector<ModelInfo> all_models;
147
148 for (const auto& service : services_) {
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()));
155 }
156 }
157
158 std::sort(
159 all_models.begin(), all_models.end(),
160 [](const ModelInfo& a, const ModelInfo& b) { return a.name < b.name; });
161
162 for (auto& model : all_models) {
163 if (model.display_name.empty()) {
164 model.display_name = model.name;
165 }
166 }
167
168 cached_models_ = all_models;
169 cache_timestamp_ = now;
170 cache_valid_ = true;
171
172 return all_models;
173}
174
175} // namespace cli
176} // namespace yaze
static ModelRegistry & GetInstance()
void RegisterService(std::shared_ptr< AIService > service)
std::vector< ModelInfo > cached_models_
std::chrono::steady_clock::time_point cache_timestamp_
absl::StatusOr< std::vector< ModelInfo > > ListAllModels(bool force_refresh=false)
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[]
Definition provider_ids.h:9
constexpr char kProviderAnthropic[]
constexpr char kProviderGeminiCli[]
AIServiceConfig BuildAIServiceConfigFromFlags()
constexpr char kProviderMock[]
Definition provider_ids.h:7
constexpr char kProviderLocalGemini[]
std::vector< AIServiceConfig > DiscoverModelRegistryConfigs(const AIServiceConfig &base_config)
constexpr char kProviderOpenAi[]
constexpr char kProviderOllama[]
Definition provider_ids.h:8