From 030a54620ef8f2759a3a2c696c81e8c45805f770 Mon Sep 17 00:00:00 2001 From: Adir Amsalem Date: Sun, 25 Oct 2026 08:26:15 +0000 Subject: [PATCH] feat: add lucy-2.6 realtime model at 720p lucy-2.6 is the successor to lucy-2.5 and a field-for-field clone of its realtime entry: /v1/stream, 1280x720 at 30 fps, fast speed tier. - Inserted right after lucy-2.5 in the realtime registry; kRealtime's std::array size literal goes 8 -> 9. - Listed in the fast-mode docs (README, ConnectOptions::speed, Speed::Fast, realtime_warmup example). - lucy-latest still resolves to lucy-2.5; it is unchanged here. --- README.md | 2 +- examples/realtime_warmup.cpp | 6 +++--- include/decart/models.h | 2 +- include/decart/realtime/realtime.h | 4 ++-- include/decart/realtime/types.h | 6 +++--- src/models.cpp | 3 ++- tests/test_models.cpp | 19 +++++++++++++++---- tests/test_stream_url.cpp | 1 + 8 files changed, 28 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 83e5f1f..85cc478 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,7 @@ request when unset, which selects the server defaults. - `speed` (`std::optional`): compute tier. Fast mode (`decart::Speed::Fast`, sent as `speed=fast`) serves the session from a higher-compute tier for lower latency and higher throughput; output quality is - unchanged. It is currently available for `lucy-2.5` / `lucy-latest` and + unchanged. It is currently available for `lucy-2.5` / `lucy-2.6` / `lucy-latest` and `lucy-vton-3.5` / `lucy-vton-3.6` / `lucy-vton-latest`, in the US region only, and is billed at 2x the standard realtime rate for those models. Other models ignore the option (the SDK logs a warning). Omit it (the default) for standard mode. diff --git a/examples/realtime_warmup.cpp b/examples/realtime_warmup.cpp index 31f0fe9..ae875fe 100644 --- a/examples/realtime_warmup.cpp +++ b/examples/realtime_warmup.cpp @@ -8,9 +8,9 @@ // // DECART_API_KEY=sk-... ./realtime_warmup [model] // -// Set DECART_SPEED=fast to request fast mode (lucy-2.5 family and -// lucy-vton-3.5 / lucy-vton-3.6 / lucy-vton-latest only; US region; billed at -// 2x the standard realtime rate). +// Set DECART_SPEED=fast to request fast mode (lucy-2.5 / lucy-2.6 / lucy-latest +// and lucy-vton-3.5 / lucy-vton-3.6 / lucy-vton-latest only; US region; billed +// at 2x the standard realtime rate). // #include #include diff --git a/include/decart/models.h b/include/decart/models.h index 01db330..51af500 100644 --- a/include/decart/models.h +++ b/include/decart/models.h @@ -33,7 +33,7 @@ namespace models { /// Resolve a realtime model by name. /// -/// Accepts canonical names ("lucy-2.1", "lucy-2.5", "lucy-vton-3.5", +/// Accepts canonical names ("lucy-2.1", "lucy-2.5", "lucy-2.6", "lucy-vton-3.5", /// "lucy-vton-3.6", "lucy-restyle-2") and server-resolved aliases /// ("lucy-latest", "lucy-vton-latest", "lucy-restyle-latest"). Aliases are /// resolved by the server; e.g. "lucy-vton-latest" currently serves diff --git a/include/decart/realtime/realtime.h b/include/decart/realtime/realtime.h index 7dbe5ca..4f0c4ab 100644 --- a/include/decart/realtime/realtime.h +++ b/include/decart/realtime/realtime.h @@ -77,8 +77,8 @@ struct ConnectOptions { /// Optional compute tier. `Speed::Fast` serves the session from a /// higher-compute tier for lower latency and higher throughput; output quality - /// is unchanged. Currently available for `lucy-2.5` / `lucy-latest` and - /// `lucy-vton-3.5` / `lucy-vton-3.6` / `lucy-vton-latest` (see + /// is unchanged. Currently available for `lucy-2.5` / `lucy-2.6` / `lucy-latest` + /// and `lucy-vton-3.5` / `lucy-vton-3.6` / `lucy-vton-latest` (see /// `ModelDefinition::supportedSpeeds`), in the US region only, and billed at /// 2x the standard realtime rate for those models. Other models ignore the /// option (the SDK logs a warning). Leave unset (the default) for standard mode. diff --git a/include/decart/realtime/types.h b/include/decart/realtime/types.h index 97349ba..18c7a8e 100644 --- a/include/decart/realtime/types.h +++ b/include/decart/realtime/types.h @@ -29,9 +29,9 @@ const char* toString(ConnectionState state) noexcept; enum class Speed { /// Fast mode: serves the session from a higher-compute tier for lower latency /// and higher throughput; output quality is unchanged. Currently available - /// for `lucy-2.5` / `lucy-latest` and `lucy-vton-3.5` / `lucy-vton-3.6` / - /// `lucy-vton-latest`, in the US region only, and billed at 2x the standard realtime rate for - /// those models. Other models ignore it. + /// for `lucy-2.5` / `lucy-2.6` / `lucy-latest` and `lucy-vton-3.5` / + /// `lucy-vton-3.6` / `lucy-vton-latest`, in the US region only, and billed at + /// 2x the standard realtime rate for those models. Other models ignore it. Fast, }; diff --git a/src/models.cpp b/src/models.cpp index 4783ee1..a4c0ca7 100644 --- a/src/models.cpp +++ b/src/models.cpp @@ -22,10 +22,11 @@ struct Entry { // Realtime model registry. Kept in sync with the shared model list across the // Decart SDKs. All realtime models stream over `/v1/stream`. -constexpr std::array kRealtime = {{ +constexpr std::array kRealtime = {{ // Canonical {"lucy-2.1", 30, 1088, 624, true}, {"lucy-2.5", 30, 1280, 720, true, /*fastSpeed=*/true}, + {"lucy-2.6", 30, 1280, 720, true, /*fastSpeed=*/true}, {"lucy-vton-3.5", 30, 1280, 720, true, /*fastSpeed=*/true}, {"lucy-vton-3.6", 30, 1280, 720, true, /*fastSpeed=*/true}, {"lucy-restyle-2", 30, 1280, 704, true}, diff --git a/tests/test_models.cpp b/tests/test_models.cpp index 035147b..d1194bd 100644 --- a/tests/test_models.cpp +++ b/tests/test_models.cpp @@ -41,6 +41,16 @@ TEST_CASE("realtime() resolves canonical models with correct geometry") { CHECK(lucy25.fps == 30); CHECK(lucy25.width == 1280); CHECK(lucy25.height == 720); + + auto lucy26 = models::realtime("lucy-2.6"); + CHECK(lucy26.name == "lucy-2.6"); + CHECK(lucy26.urlPath == "/v1/stream"); + CHECK(lucy26.fps == 30); + CHECK(lucy26.width == 1280); + CHECK(lucy26.height == 720); + // 2.6 is offered on the fast tier, like 2.5. + REQUIRE(lucy26.supportedSpeeds.size() == 1); + CHECK(static_cast(lucy26.supportedSpeeds[0]) == static_cast(Speed::Fast)); } TEST_CASE("realtime() accepts latest aliases (lucy-vton-latest resolves server-side to lucy-vton-3.6)") { @@ -69,7 +79,7 @@ TEST_CASE("realtime() throws ModelNotFound for unknown names") { } } -TEST_CASE("supportedSpeeds advertises fast mode on exactly the lucy-2.5 and lucy-vton-3.5/3.6 families") { +TEST_CASE("supportedSpeeds advertises fast mode on exactly the lucy-2.5/2.6 and lucy-vton-3.5/3.6 families") { // Compare via integer form: doctest stringifies enums through our ADL // toString() (which returns const char*) and cannot concatenate that. const auto fastOnly = std::vector{static_cast(Speed::Fast)}; @@ -80,13 +90,14 @@ TEST_CASE("supportedSpeeds advertises fast mode on exactly the lucy-2.5 and lucy }; CHECK(speeds(models::realtime("lucy-2.5")) == fastOnly); + CHECK(speeds(models::realtime("lucy-2.6")) == fastOnly); CHECK(speeds(models::realtime("lucy-latest")) == fastOnly); CHECK(speeds(models::realtime("lucy-vton-3.5")) == fastOnly); CHECK(speeds(models::realtime("lucy-vton-3.6")) == fastOnly); CHECK(speeds(models::realtime("lucy-vton-latest")) == fastOnly); - const std::set withFast = {"lucy-2.5", "lucy-latest", "lucy-vton-3.5", "lucy-vton-3.6", - "lucy-vton-latest"}; + const std::set withFast = {"lucy-2.5", "lucy-2.6", "lucy-latest", + "lucy-vton-3.5", "lucy-vton-3.6", "lucy-vton-latest"}; for (const auto& m : models::listRealtime(/*canonicalOnly=*/false)) { INFO("model " << m.name); if (withFast.count(m.name)) { @@ -105,6 +116,6 @@ TEST_CASE("supportedSpeeds advertises fast mode on exactly the lucy-2.5 and lucy TEST_CASE("listRealtime() honors canonicalOnly") { auto all = models::listRealtime(/*canonicalOnly=*/false); auto canonical = models::listRealtime(/*canonicalOnly=*/true); - CHECK(canonical.size() == 5); + CHECK(canonical.size() == 6); CHECK(all.size() > canonical.size()); } diff --git a/tests/test_stream_url.cpp b/tests/test_stream_url.cpp index daf7b33..411dff8 100644 --- a/tests/test_stream_url.cpp +++ b/tests/test_stream_url.cpp @@ -84,6 +84,7 @@ TEST_CASE("buildStreamUrl is deterministic: rebuilding yields the same speed par TEST_CASE("supportsSpeed reflects ModelDefinition::supportedSpeeds") { CHECK(supportsSpeed(models::realtime("lucy-2.5"), Speed::Fast)); + CHECK(supportsSpeed(models::realtime("lucy-2.6"), Speed::Fast)); CHECK(supportsSpeed(models::realtime("lucy-latest"), Speed::Fast)); CHECK(supportsSpeed(models::realtime("lucy-vton-3.5"), Speed::Fast)); CHECK(supportsSpeed(models::realtime("lucy-vton-3.6"), Speed::Fast));