Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 9 additions & 4 deletions MANIFEST.md
Original file line number Diff line number Diff line change
Expand Up @@ -703,11 +703,16 @@ Lemonade embeddable archive from the official Lemonade SDK GitHub releases at
to the rocm-cli managed data directory and is reused for subsequent
`rocm engines start lemonade` invocations. This is a self-contained binary
distribution; no Python packages are installed for Lemonade by rocm-cli.
On Linux/WSL, `rocm engines install lemonade` may also query
`https://api.github.com/repos/lemonade-sdk/llama.cpp/releases/latest` (an
unauthenticated call) while aligning Lemonade's `llamacpp:rocm` backend to
the active ROCm SDK version; see
On Linux/WSL and Windows, `rocm engines install lemonade` may also list
`https://api.github.com/repos/lemonade-sdk/llama.cpp/releases` (the 30 newest
releases, one unauthenticated call) while aligning Lemonade's `llamacpp:rocm`
backend to the active ROCm SDK version; see
[Lemonade backend alignment on engine install](docs/engine-plugins.md#lemonade-backend-alignment-on-engine-install).
Lemonade itself then downloads the llama.cpp backend it installs from the
`lemonade-sdk/llama.cpp` GitHub releases, and the ROCm runtime that backend
runs on from AMD's ROCm package repository (as Python wheels into a virtual
environment of Lemonade's own, or as a TheRock tarball); those downloads are
Lemonade's, not rocm-cli's.

### Engine-Specific Python Dependencies

Expand Down
4 changes: 2 additions & 2 deletions crates/e2e-report/src/consolidated/markdown.rs
Original file line number Diff line number Diff line change
Expand Up @@ -718,7 +718,7 @@ mod tests {
let platform = r#"{
"platform_slug": "mi300x",
"capability": {"effective_serve_engine": "vllm"},
"versions": {"os":"Ubuntu 24.04.3 LTS","rocm":"7.13.0","vllm":"0.23.0+rocm723","lemonade":"11.5.1"},
"versions": {"os":"Ubuntu 24.04.3 LTS","rocm":"7.13.0","vllm":"0.23.0+rocm723","lemonade":"2026.44.1"},
"expectations": [
{"id":"serve-x","effective_engine":"vllm","expected":"pass"}
]
Expand All @@ -730,7 +730,7 @@ mod tests {
"Ubuntu 24.04.3 LTS",
"ROCm 7.13.0",
"vLLM 0.23.0+rocm723",
"lemonade 11.5.1",
"lemonade 2026.44.1",
] {
assert!(md.contains(token), "matrix cell missing {token:?}:\n{md}");
}
Expand Down
6 changes: 3 additions & 3 deletions crates/rocm-dash-tui/src/skills.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,11 @@ pub fn lemonade_embeddable_fallback_version() -> String {
/// and locate the server binary. Pure data; no I/O.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct EmbeddableArtifact {
/// Version without a leading `v`, e.g. `11.5.1`.
/// Version without a leading `v`, e.g. `2026.44.1`.
pub version: String,
/// The archive's `browser_download_url`.
pub url: String,
/// The archive file name, e.g. `lemonade-embeddable-11.5.1-ubuntu-x64.tar.gz`.
/// The archive file name, e.g. `lemonade-embeddable-2026.44.1-ubuntu-x64.tar.gz`.
pub archive_name: String,
/// The unpacked server executable name (`lemond` / `lemond.exe`).
pub server_bin: String,
Expand Down Expand Up @@ -303,7 +303,7 @@ fn server_bin_for(os: &str) -> &'static str {
}
}

/// Strip a leading `v` from a release tag (`v11.5.1` → `11.5.1`).
/// Strip a leading `v` from a release tag (`v2026.44.1` → `2026.44.1`).
fn strip_v(tag: &str) -> &str {
rocm_deps::strip_v(tag)
}
Expand Down
4 changes: 2 additions & 2 deletions crates/rocm-deps/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ include!(concat!(env!("OUT_DIR"), "/pins.rs"));
/// GitHub repository publishing the Lemonade embeddable release archives.
pub const LEMONADE_GITHUB_REPO: &str = "lemonade-sdk/lemonade";

/// Strip a leading `v` from a release tag (`v11.5.1` -> `11.5.1`).
/// Strip a leading `v` from a release tag (`v2026.44.1` -> `2026.44.1`).
#[must_use]
pub fn strip_v(tag: &str) -> &str {
tag.strip_prefix('v').unwrap_or(tag)
}

/// Name of the Lemonade embeddable archive for a host token and extension,
/// e.g. `lemonade-embeddable-11.5.1-ubuntu-x64.tar.gz`.
/// e.g. `lemonade-embeddable-2026.44.1-ubuntu-x64.tar.gz`.
#[must_use]
pub fn lemonade_archive_name(version: &str, os_arch: &str, extension: &str) -> String {
format!(
Expand Down
28 changes: 19 additions & 9 deletions docs/engine-plugins.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,13 +54,20 @@ The rewrite tries two builds in order. The first keeps Lemonade's own pinned
llama.cpp release and just repoints it at the active ROCm version — a
deliberate, reproducible pin. If that attempt fails to resolve against the
installed backend's shared libraries — for example because that release never
shipped an asset for the active ROCm version — the second queries GitHub's
`releases/latest` for `lemonade-sdk/llama.cpp` (an unauthenticated
`api.github.com` call, subject to GitHub's public rate limit) and installs
whatever build is newest at that moment. That second build is a moving
target, not a pin: which llama.cpp commit actually gets installed depends on
when the install ran, and the version installed is not recorded anywhere
`rocm examine`/`rocm version` report. An attempt that cannot be verified
shipped an asset for the active ROCm version — the second lists the 30 newest
`lemonade-sdk/llama.cpp` releases on GitHub (an unauthenticated
`api.github.com` call, subject to GitHub's public rate limit) and installs the
most recently published one that ships the llama.cpp archive for the active
ROCm version's `major.minor` on this platform
(`llama-<tag>-bin-ubuntu-rocm-<major.minor>-x64.tar.gz` on Linux,
`llama-<tag>-bin-win-rocm-<major.minor>-x64.zip` on Windows). The newest
release alone is not used, because a release can be published without its
ROCm archives. The second attempt is skipped when none of the 30 ships that
archive, when the listing cannot be fetched, and when the build it finds is the
one Lemonade already pins (the first attempt tried that build). That second build is a moving target, not a pin: which llama.cpp
commit actually gets installed depends on when the install ran, and the
version installed is not recorded anywhere `rocm examine`/`rocm version`
report. An attempt that cannot be verified
against the installed backend's shared libraries reverts to whichever version
was pinned before the attempt — the packaged pin on a fresh install or after
`--reinstall`, but whatever alignment last wrote otherwise — rather than
Expand Down Expand Up @@ -132,8 +139,11 @@ The versions of the third-party runtimes rocm-cli downloads are pinned in
`runtime-deps.toml` at the repository root — one `[runtime.<name>]` table per
runtime. That file is the only place a runtime version is written down:
archive names, download URLs, and the dashboard's offline fallback are all
derived from it, so a bump is a one-line edit and the tree cannot end up
holding two different versions of the same runtime.
derived from it, so the tree cannot end up holding two different versions of
the same runtime. A Lemonade bump also records the new release's archive
digests (`EMBEDDABLE_LINUX_SHA256` and `EMBEDDABLE_WINDOWS_SHA256` in
[install.rs](../engines/lemonade/src/install.rs)): the downloaded archive is
checked against them, and a digest cannot be derived from the version.

`rocm engines list` shows the exact plugin directories for the current host.
The same output is available in the TUI with `/engine`.
Expand Down
21 changes: 21 additions & 0 deletions docs/testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,27 @@ lemonade` against the shared tree) reaches the restore only on a runner whose
shared tree still holds a stale pin; on a healthy runner the install succeeds and
the restore never runs, so a green lane does not show that it works.

Lemonade backend selection and alignment focused tests (reading the
`llamacpp` rows out of `lemonade backends` when other recipes have indented
rows of their own, and the second alignment attempt choosing the newest
`lemonade-sdk/llama.cpp` release that ships the archive for the active ROCm
version rather than the newest release, and reading Lemonade's
`update_required`/`update_available` backend states):

```bash
cargo test -p rocm-engine-lemonade llamacpp_backend::tests::parse
cargo test -p rocm-engine-lemonade llamacpp_backend::tests::another_recipes_backend
cargo test -p rocm-engine-lemonade llamacpp_backend::tests::update_states
cargo test -p rocm-engine-lemonade backend_alignment::tests::tier2
cargo test -p rocm-engine-lemonade backend_alignment::tests::align_falls_through_to_tier2
cargo test -p rocm-engine-lemonade backend_alignment::tests::llamacpp_asset_name
```

They run on fixtures: the `lemonade backends` table Lemonade 2026.44.1 prints,
and a release listing shaped like the real one. The live paths (a real
`lemond`, the GitHub listing, a real backend install) run only on the gated
Lemonade GPU lanes.

Engine recipe adapter contract focused tests:

```bash
Expand Down
Loading
Loading