Skip to content

Commit fb5e329

Browse files
author
Your Name
committed
remove stripping version
1 parent 44f86d1 commit fb5e329

11 files changed

+94
-99
lines changed

sdk/cpp/sample/main.cpp

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
#include <iostream>
2+
#include "foundry_local.h"
23

3-
#include <cstdio>
4+
#include <iostream>
45
#include <string>
56
#include <vector>
67

7-
#include "foundry_local.h"
8-
9-
108
using namespace FoundryLocal;
119

1210
// ---------------------------------------------------------------------------
@@ -82,7 +80,13 @@ void ChatNonStreaming(FoundryLocalManager& manager, const std::string& alias) {
8280
std::cout << "\n";
8381

8482
model->Load();
85-
std::cout << "Model loaded: " << model->GetAlias() << "\n";
83+
84+
if (model->IsLoaded()) {
85+
std::cout << "Model is loaded and ready for inference.\n";
86+
} else {
87+
std::cerr << "Failed to load model.\n";
88+
return;
89+
}
8690

8791
// Get the selected variant pointer for ChatClient
8892
const auto& selectedVariant = model->GetAllModelVariants()[0];

sdk/cpp/src/foundry_local.cpp

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -89,25 +89,16 @@ namespace {
8989
}
9090
}
9191

92-
inline void StripSuffixAfterColon(std::string& id) {
93-
const auto pos = id.find_last_of(':');
94-
if (pos != std::string::npos) {
95-
id.erase(pos);
96-
}
97-
}
98-
9992
std::vector<const FoundryLocal::ModelVariant*>
100-
CollectVariantsByIds(const std::unordered_map<std::string, const FoundryLocal::ModelVariant*>& modelIdToModelVariant,
93+
CollectVariantsByIds(const std::unordered_map<std::string, FoundryLocal::ModelVariant>& modelIdToModelVariant,
10194
std::vector<std::string> ids) {
10295
std::vector<const FoundryLocal::ModelVariant*> out;
10396
out.reserve(ids.size());
10497

105-
for (auto& id : ids) {
106-
StripSuffixAfterColon(id);
107-
98+
for (const auto& id : ids) {
10899
auto it = modelIdToModelVariant.find(id);
109100
if (it != modelIdToModelVariant.end()) {
110-
out.emplace_back(it->second);
101+
out.emplace_back(&it->second);
111102
}
112103
}
113104
return out;
@@ -435,13 +426,8 @@ namespace FoundryLocal {
435426

436427
bool ModelVariant::IsLoaded() const {
437428
std::vector<std::string> loadedModelIds = GetLoadedModelsInternal(core_, *logger_);
438-
for (auto& id : loadedModelIds) {
439-
auto pos = id.find_last_of(':');
440-
if (pos != std::string::npos) {
441-
id.erase(pos);
442-
}
443-
444-
if (id == info_.name) {
429+
for (const auto& id : loadedModelIds) {
430+
if (id == info_.id) {
445431
return true;
446432
}
447433
}
@@ -451,9 +437,8 @@ namespace FoundryLocal {
451437

452438
bool ModelVariant::IsCached() const {
453439
auto cachedModels = GetCachedModelsInternal(core_, *logger_);
454-
for (auto& id : cachedModels) {
455-
StripSuffixAfterColon(id);
456-
if (id == info_.name) {
440+
for (const auto& id : cachedModels) {
441+
if (id == info_.id) {
457442
return true;
458443
}
459444
}
@@ -666,13 +651,18 @@ namespace FoundryLocal {
666651

667652
ModelInfo modelVariantInfo;
668653
from_json(j, modelVariantInfo);
654+
std::string variantId = modelVariantInfo.id;
669655
ModelVariant modelVariant(core_, modelVariantInfo, logger_);
656+
modelIdToModelVariant_.emplace(variantId, modelVariant);
657+
670658
it->second.variants_.emplace_back(std::move(modelVariant));
659+
}
671660

672-
for (const auto& v : it->second.variants_) {
673-
modelIdToModelVariant_[v.GetInfo().name] = &v;
661+
// Auto-select the first variant for each model.
662+
for (auto& [alias, model] : byAlias_) {
663+
if (!model.variants_.empty()) {
664+
model.selectedVariantIndex_ = 0;
674665
}
675-
it->second.selectedVariantIndex_ = 0;
676666
}
677667

678668
lastFetch_ = now;
@@ -681,7 +671,7 @@ namespace FoundryLocal {
681671
const ModelVariant* Catalog::GetModelVariant(std::string_view id) const {
682672
auto it = modelIdToModelVariant_.find(std::string(id));
683673
if (it != modelIdToModelVariant_.end()) {
684-
return it->second;
674+
return &it->second;
685675
}
686676
return nullptr;
687677
}

sdk/cpp/test/catalog_test.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -113,29 +113,29 @@ TEST_F(CatalogTest, GetModelVariant_Found) {
113113
auto catalog = MakeCatalog();
114114
catalog->ListModels(); // populate
115115

116-
auto* variant = catalog->GetModelVariant("model-1");
116+
auto* variant = catalog->GetModelVariant("model-1:1");
117117
ASSERT_NE(nullptr, variant);
118-
EXPECT_EQ("model-1", variant->GetId());
118+
EXPECT_EQ("model-1:1", variant->GetId());
119119
}
120120

121121
TEST_F(CatalogTest, GetModelVariant_NotFound) {
122122
core_.OnCall("get_model_list", MakeModelListJson({{"model-1", "my-model"}}));
123123
auto catalog = MakeCatalog();
124124
catalog->ListModels();
125125

126-
EXPECT_EQ(nullptr, catalog->GetModelVariant("nonexistent"));
126+
EXPECT_EQ(nullptr, catalog->GetModelVariant("nonexistent:1"));
127127
}
128128

129129
TEST_F(CatalogTest, GetLoadedModels) {
130130
core_.OnCall("get_model_list", MakeModelListJson({{"model-1", "alias-1"}, {"model-2", "alias-2"}}));
131-
core_.OnCall("list_loaded_models", R"(["model-1:v1"])");
131+
core_.OnCall("list_loaded_models", R"(["model-1:1"])");
132132

133133
auto catalog = MakeCatalog();
134134
catalog->ListModels(); // populate
135135

136136
auto loaded = catalog->GetLoadedModels();
137137
ASSERT_EQ(1u, loaded.size());
138-
EXPECT_EQ("model-1", loaded[0]->GetId());
138+
EXPECT_EQ("model-1:1", loaded[0]->GetId());
139139
}
140140

141141
TEST_F(CatalogTest, GetCachedModels) {
@@ -200,11 +200,11 @@ TEST_F(FileBasedCatalogTest, RealModelsList_VariantDetails) {
200200

201201
catalog->ListModels(); // populate
202202

203-
const auto* gpuVariant = catalog->GetModelVariant("Phi-4-generic-gpu");
203+
const auto* gpuVariant = catalog->GetModelVariant("Phi-4-generic-gpu:1");
204204
ASSERT_NE(nullptr, gpuVariant);
205205

206206
const auto& info = gpuVariant->GetInfo();
207-
EXPECT_EQ("Phi-4-generic-gpu", info.id);
207+
EXPECT_EQ("Phi-4-generic-gpu:1", info.id);
208208
EXPECT_EQ("Phi-4-generic-gpu", info.name);
209209
EXPECT_EQ("phi-4", info.alias);
210210
ASSERT_TRUE(info.display_name.has_value());
@@ -235,7 +235,7 @@ TEST_F(FileBasedCatalogTest, RealModelsList_CpuVariantDetails) {
235235

236236
catalog->ListModels(); // populate
237237

238-
const auto* cpuVariant = catalog->GetModelVariant("Phi-4-generic-cpu");
238+
const auto* cpuVariant = catalog->GetModelVariant("Phi-4-generic-cpu:1");
239239
ASSERT_NE(nullptr, cpuVariant);
240240

241241
const auto& info = cpuVariant->GetInfo();

sdk/cpp/test/client_test.cpp

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ class ChatClientTest : public ::testing::Test {
3030
}
3131

3232
ModelVariant MakeLoadedVariant(const std::string& name = "chat-model") {
33-
core_.OnCall("list_loaded_models", "[\"" + name + ":v1\"]");
33+
core_.OnCall("list_loaded_models", "[\"" + name + ":1\"]");
3434
return Factory::CreateModelVariant(&core_, Factory::MakeModelInfo(name, "alias"), &logger_);
3535
}
3636
};
3737

3838
TEST_F(ChatClientTest, CompleteChat_BasicResponse) {
3939
core_.OnCall("chat_completions", MakeChatResponseJson("Hello world!"));
40-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
40+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
4141

4242
auto variant = MakeLoadedVariant();
4343
ChatClient client(&variant);
@@ -52,16 +52,16 @@ TEST_F(ChatClientTest, CompleteChat_BasicResponse) {
5252
}
5353

5454
TEST_F(ChatClientTest, CompleteChat_WithSettings) {
55-
core_.OnCall("chat_completions", MakeChatResponseJson());
56-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
55+
core_.OnCall("chat_completions", MakeChatResponseJson());
56+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
5757

58-
auto variant = MakeLoadedVariant();
59-
ChatClient client(&variant);
58+
auto variant = MakeLoadedVariant();
59+
ChatClient client(&variant);
6060

61-
std::vector<ChatMessage> messages = {{"user", "test", {}}};
62-
ChatSettings settings;
63-
settings.temperature = 0.7f;
64-
settings.max_tokens = 100;
61+
std::vector<ChatMessage> messages = {{"user", "test", {}}};
62+
ChatSettings settings;
63+
settings.temperature = 0.7f;
64+
settings.max_tokens = 100;
6565
settings.top_p = 0.9f;
6666
settings.frequency_penalty = 0.5f;
6767
settings.presence_penalty = 0.3f;
@@ -86,15 +86,15 @@ TEST_F(ChatClientTest, CompleteChat_WithSettings) {
8686
}
8787

8888
TEST_F(ChatClientTest, CompleteChat_RequestFormat) {
89-
core_.OnCall("chat_completions", MakeChatResponseJson());
90-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
89+
core_.OnCall("chat_completions", MakeChatResponseJson());
90+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
9191

92-
auto variant = MakeLoadedVariant();
93-
ChatClient client(&variant);
92+
auto variant = MakeLoadedVariant();
93+
ChatClient client(&variant);
9494

95-
std::vector<ChatMessage> messages = {{"system", "You are helpful", {}}, {"user", "Hello", {}}};
96-
ChatSettings settings;
97-
auto response = client.CompleteChat(messages, settings);
95+
std::vector<ChatMessage> messages = {{"system", "You are helpful", {}}, {"user", "Hello", {}}};
96+
ChatSettings settings;
97+
auto response = client.CompleteChat(messages, settings);
9898

9999
auto requestJson = nlohmann::json::parse(core_.GetLastDataArg("chat_completions"));
100100
auto openAiReq = nlohmann::json::parse(requestJson["Params"]["OpenAICreateRequest"].get<std::string>());
@@ -134,7 +134,7 @@ TEST_F(ChatClientTest, CompleteChatStreaming) {
134134
}
135135
return "";
136136
});
137-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
137+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
138138

139139
auto variant = MakeLoadedVariant();
140140
ChatClient client(&variant);
@@ -172,7 +172,7 @@ TEST_F(ChatClientTest, CompleteChatStreaming_PropagatesCallbackException) {
172172
}
173173
return "";
174174
});
175-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
175+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
176176

177177
auto variant = MakeLoadedVariant();
178178
ChatClient client(&variant);
@@ -193,7 +193,7 @@ TEST_F(ChatClientTest, Constructor_ThrowsIfNotLoaded) {
193193
}
194194

195195
TEST_F(ChatClientTest, GetModelId) {
196-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
196+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
197197
auto variant = MakeLoadedVariant();
198198
ChatClient client(&variant);
199199
EXPECT_EQ("chat-model", client.GetModelId());
@@ -203,7 +203,7 @@ TEST_F(ChatClientTest, GetModelId) {
203203

204204
TEST_F(ChatClientTest, CompleteChat_WithTools_IncludesToolsInRequest) {
205205
core_.OnCall("chat_completions", MakeChatResponseJson());
206-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
206+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
207207

208208
auto variant = MakeLoadedVariant();
209209
ChatClient client(&variant);
@@ -252,7 +252,7 @@ TEST_F(ChatClientTest, CompleteChat_WithTools_IncludesToolsInRequest) {
252252

253253
TEST_F(ChatClientTest, CompleteChat_WithoutTools_OmitsToolsField) {
254254
core_.OnCall("chat_completions", MakeChatResponseJson());
255-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
255+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
256256

257257
auto variant = MakeLoadedVariant();
258258
ChatClient client(&variant);
@@ -288,7 +288,7 @@ TEST_F(ChatClientTest, CompleteChat_ToolCallResponse_Parsed) {
288288
{"function", {{"name", "multiply_numbers"}, {"arguments", "{\"first\": 7, \"second\": 6}"}}}}}}}}}}}};
289289

290290
core_.OnCall("chat_completions", resp.dump());
291-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
291+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
292292

293293
auto variant = MakeLoadedVariant();
294294
ChatClient client(&variant);
@@ -312,7 +312,7 @@ TEST_F(ChatClientTest, CompleteChat_ToolCallResponse_Parsed) {
312312

313313
TEST_F(ChatClientTest, CompleteChat_ToolChoiceAuto) {
314314
core_.OnCall("chat_completions", MakeChatResponseJson());
315-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
315+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
316316

317317
auto variant = MakeLoadedVariant();
318318
ChatClient client(&variant);
@@ -330,7 +330,7 @@ TEST_F(ChatClientTest, CompleteChat_ToolChoiceAuto) {
330330

331331
TEST_F(ChatClientTest, CompleteChat_ToolChoiceNone) {
332332
core_.OnCall("chat_completions", MakeChatResponseJson());
333-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
333+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
334334

335335
auto variant = MakeLoadedVariant();
336336
ChatClient client(&variant);
@@ -348,7 +348,7 @@ TEST_F(ChatClientTest, CompleteChat_ToolChoiceNone) {
348348

349349
TEST_F(ChatClientTest, CompleteChat_ToolMessageWithToolCallId) {
350350
core_.OnCall("chat_completions", MakeChatResponseJson());
351-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
351+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
352352

353353
auto variant = MakeLoadedVariant();
354354
ChatClient client(&variant);
@@ -412,7 +412,7 @@ TEST_F(ChatClientTest, CompleteChatStreaming_WithTools) {
412412
}
413413
return "";
414414
});
415-
core_.OnCall("list_loaded_models", R"(["chat-model:v1"])");
415+
core_.OnCall("list_loaded_models", R"(["chat-model:1"])");
416416

417417
auto variant = MakeLoadedVariant();
418418
ChatClient client(&variant);
@@ -450,14 +450,14 @@ class AudioClientTest : public ::testing::Test {
450450
NullLogger logger_;
451451

452452
ModelVariant MakeLoadedVariant(const std::string& name = "audio-model") {
453-
core_.OnCall("list_loaded_models", "[\"" + name + ":v1\"]");
453+
core_.OnCall("list_loaded_models", "[\"" + name + ":1\"]");
454454
return Factory::CreateModelVariant(&core_, Factory::MakeModelInfo(name, "alias"), &logger_);
455455
}
456456
};
457457

458458
TEST_F(AudioClientTest, TranscribeAudio) {
459459
core_.OnCall("audio_transcribe", "Hello world transcribed text");
460-
core_.OnCall("list_loaded_models", R"(["audio-model:v1"])");
460+
core_.OnCall("list_loaded_models", R"(["audio-model:1"])");
461461

462462
auto variant = MakeLoadedVariant();
463463
AudioClient client(&variant);
@@ -468,7 +468,7 @@ TEST_F(AudioClientTest, TranscribeAudio) {
468468

469469
TEST_F(AudioClientTest, TranscribeAudio_RequestFormat) {
470470
core_.OnCall("audio_transcribe", "text");
471-
core_.OnCall("list_loaded_models", R"(["audio-model:v1"])");
471+
core_.OnCall("list_loaded_models", R"(["audio-model:1"])");
472472

473473
auto variant = MakeLoadedVariant();
474474
AudioClient client(&variant);
@@ -492,7 +492,7 @@ TEST_F(AudioClientTest, TranscribeAudioStreaming) {
492492
}
493493
return "";
494494
});
495-
core_.OnCall("list_loaded_models", R"(["audio-model:v1"])");
495+
core_.OnCall("list_loaded_models", R"(["audio-model:1"])");
496496

497497
auto variant = MakeLoadedVariant();
498498
AudioClient client(&variant);
@@ -516,7 +516,7 @@ TEST_F(AudioClientTest, TranscribeAudioStreaming_PropagatesCallbackException) {
516516
}
517517
return "";
518518
});
519-
core_.OnCall("list_loaded_models", R"(["audio-model:v1"])");
519+
core_.OnCall("list_loaded_models", R"(["audio-model:1"])");
520520

521521
auto variant = MakeLoadedVariant();
522522
AudioClient client(&variant);
@@ -534,7 +534,7 @@ TEST_F(AudioClientTest, Constructor_ThrowsIfNotLoaded) {
534534
}
535535

536536
TEST_F(AudioClientTest, GetModelId) {
537-
core_.OnCall("list_loaded_models", R"(["audio-model:v1"])");
537+
core_.OnCall("list_loaded_models", R"(["audio-model:1"])");
538538
auto variant = MakeLoadedVariant();
539539
AudioClient client(&variant);
540540
EXPECT_EQ("audio-model", client.GetModelId());

0 commit comments

Comments
 (0)