lemonade-sdk 8.1.7__py3-none-any.whl → 8.1.9__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of lemonade-sdk might be problematic. Click here for more details.

Files changed (29) hide show
  1. lemonade/cli.py +47 -5
  2. lemonade/profilers/agt_power.py +437 -0
  3. lemonade/profilers/hwinfo_power.py +429 -0
  4. lemonade/tools/llamacpp/utils.py +15 -4
  5. lemonade/tools/oga/load.py +15 -2
  6. lemonade/tools/report/table.py +1 -1
  7. lemonade/tools/server/llamacpp.py +19 -13
  8. lemonade/tools/server/serve.py +39 -9
  9. lemonade/tools/server/static/js/chat.js +545 -242
  10. lemonade/tools/server/static/js/models.js +112 -24
  11. lemonade/tools/server/static/js/shared.js +15 -5
  12. lemonade/tools/server/static/styles.css +145 -75
  13. lemonade/tools/server/static/webapp.html +23 -27
  14. lemonade/tools/server/wrapped_server.py +8 -0
  15. lemonade/version.py +1 -1
  16. lemonade_install/install.py +15 -49
  17. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/METADATA +16 -64
  18. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/RECORD +26 -27
  19. lemonade_server/cli.py +12 -9
  20. lemonade_server/model_manager.py +48 -0
  21. lemonade_server/server_models.json +24 -6
  22. lemonade/tools/quark/__init__.py +0 -0
  23. lemonade/tools/quark/quark_load.py +0 -173
  24. lemonade/tools/quark/quark_quantize.py +0 -439
  25. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/WHEEL +0 -0
  26. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/entry_points.txt +0 -0
  27. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/licenses/LICENSE +0 -0
  28. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/licenses/NOTICE.md +0 -0
  29. {lemonade_sdk-8.1.7.dist-info → lemonade_sdk-8.1.9.dist-info}/top_level.txt +0 -0
@@ -32,27 +32,25 @@
32
32
  <div class="tab-container">
33
33
  <div class="tabs">
34
34
  <div class="tab-group">
35
- <button class="tab active" id="tab-chat" onclick="showTab('chat')">LLM Chat</button>
36
- <button class="tab" id="tab-model-settings" onclick="showTab('settings')">Model Settings</button>
37
- <button class="tab" id="tab-models" onclick="showTab('models')">Model Management</button>
38
- </div>
39
-
40
- <!-- Model Status Indicator integrated into tab bar -->
41
- <div class="model-status-indicator" id="model-status-indicator">
42
- <div class="status-light" id="status-light"></div>
43
- <span class="model-status-text" id="model-status-text">Loading...</span>
44
- <button class="model-action-btn" id="model-unload-btn" style="display: none;" title="Unload model">⏏</button>
45
- </div>
46
- </div>
47
- <div class="tab-content active" id="content-chat">
48
- <div class="chat-container">
49
- <div class="chat-history" id="chat-history"></div>
50
- <div class="chat-input-row">
51
- <select id="model-select" class="model-select">
52
- <option value="">Pick a model</option>
53
- </select>
35
+ <button class="tab active" id="tab-chat" onclick="showTab('chat')">LLM Chat</button>
36
+ <button class="tab" id="tab-model-settings" onclick="showTab('settings')">Model Settings</button>
37
+ <button class="tab" id="tab-models" onclick="showTab('models')">Model Management</button>
38
+ </div>
39
+
40
+ <div class="model-status-indicator" id="model-status-indicator">
41
+ <div class="status-light" id="status-light"></div>
42
+ <select id="model-select" class="model-select">
43
+ <option value="">Pick a model</option>
44
+ </select>
45
+ <button class="model-action-btn" id="model-unload-btn" title="Unload model" style="display: flex;">⏏</button>
46
+ </div>
47
+ </div>
48
+ <div class="tab-content active" id="content-chat">
49
+ <div class="chat-container">
50
+ <div class="chat-history" id="chat-history"></div>
51
+ <div class="chat-input-row">
54
52
  <div class="input-with-indicator">
55
- <input type="text" id="chat-input" placeholder="Type your message..." />
53
+ <textarea id="chat-input" placeholder="Type your message..." rows="1"></textarea>
56
54
  </div>
57
55
  <input type="file" id="file-attachment" style="display: none;" multiple accept="image/*">
58
56
  <button id="attachment-btn" title="Attach files">&#x1F4CE;</button>
@@ -92,9 +90,9 @@
92
90
  <img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/lm_eval.png" alt="LM-Eval" class="app-logo-img">
93
91
  <span class="app-name">LM-Eval</span>
94
92
  </a>
95
- <a href="https://lemonade-server.ai/docs/server/apps/codeGPT/" target="_blank" class="app-logo-item" title="CodeGPT">
96
- <img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/codegpt.jpg" alt="CodeGPT" class="app-logo-img">
97
- <span class="app-name">CodeGPT</span>
93
+ <a href="https://github.com/lemonade-sdk/lemonade-arcade" target="_blank" class="app-logo-item" title="Lemonade Arcade">
94
+ <img src="https://raw.githubusercontent.com/lemonade-sdk/lemonade-arcade/refs/heads/main/docs/assets/favicon.ico" alt="Lemonade Arcade" class="app-logo-img">
95
+ <span class="app-name">Lemonade Arcade</span>
98
96
  </a>
99
97
  <a href="https://github.com/lemonade-sdk/lemonade/blob/main/docs/server/apps/ai-toolkit.md" target="_blank" class="app-logo-item" title="AI Toolkit">
100
98
  <img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/ai_toolkit.png" alt="AI Toolkit" class="app-logo-img">
@@ -142,7 +140,6 @@
142
140
  </div>
143
141
  <div class="category-content expanded" id="category-hot"></div>
144
142
  </div>
145
-
146
143
  <div class="model-category-section">
147
144
  <div class="section-header">
148
145
  <span class="section-icon">🔧</span>
@@ -155,7 +152,6 @@
155
152
  <div class="subcategory" data-recipe="oga-cpu" onclick="selectRecipe('oga-cpu')">OGA CPU</div>
156
153
  </div>
157
154
  </div>
158
-
159
155
  <div class="model-category-section">
160
156
  <div class="section-header">
161
157
  <span class="section-icon">🏷️</span>
@@ -165,12 +161,12 @@
165
161
  <div class="subcategory" data-label="coding" onclick="selectLabel('coding')">Coding</div>
166
162
  <div class="subcategory" data-label="vision" onclick="selectLabel('vision')">Vision</div>
167
163
  <div class="subcategory" data-label="reasoning" onclick="selectLabel('reasoning')">Reasoning</div>
164
+ <div class="subcategory" data-label="tool-calling" onclick="selectLabel('tool-calling')">Tool Calling</div>
168
165
  <div class="subcategory" data-label="reranking" onclick="selectLabel('reranking')">Reranking</div>
169
166
  <div class="subcategory" data-label="embeddings" onclick="selectLabel('embeddings')">Embeddings</div>
170
167
  <div class="subcategory" data-label="custom" onclick="selectLabel('custom')">Custom</div>
171
168
  </div>
172
169
  </div>
173
-
174
170
  <div class="model-category" data-category="add">
175
171
  <div class="category-header" onclick="showAddModelForm()">
176
172
  <span class="category-icon">➕</span>
@@ -178,7 +174,6 @@
178
174
  </div>
179
175
  </div>
180
176
  </div>
181
-
182
177
  <div class="model-browser-main">
183
178
  <div class="model-list" id="model-list"></div>
184
179
 
@@ -255,3 +250,4 @@
255
250
  <script src="/static/js/chat.js"></script>
256
251
  </body>
257
252
  </html>
253
+ </html>
@@ -81,6 +81,7 @@ class WrappedServer(ABC):
81
81
  self.process: subprocess.Popen = None
82
82
  self.server_name: str = server_name
83
83
  self.telemetry: WrappedServerTelemetry = telemetry
84
+ self.log_thread_exception = None
84
85
 
85
86
  def choose_port(self):
86
87
  """
@@ -192,6 +193,8 @@ class WrappedServer(ABC):
192
193
 
193
194
  if self.process.poll() is not None:
194
195
  break
196
+ except HTTPException as e:
197
+ self.log_thread_exception = e
195
198
  except UnicodeDecodeError as e:
196
199
  logging.debug(
197
200
  "Unicode decode error reading subprocess output: %s", str(e)
@@ -217,6 +220,11 @@ class WrappedServer(ABC):
217
220
  )
218
221
  time.sleep(1)
219
222
 
223
+ if self.log_thread_exception:
224
+ e = self.log_thread_exception
225
+ self.log_thread_exception = None
226
+ raise e
227
+
220
228
  @abstractmethod
221
229
  def _launch_server_subprocess(
222
230
  self,
lemonade/version.py CHANGED
@@ -1 +1 @@
1
- __version__ = "8.1.7"
1
+ __version__ = "8.1.9"
@@ -48,10 +48,6 @@ NPU_DRIVER_DOWNLOAD_URL = (
48
48
  REQUIRED_NPU_DRIVER_VERSION = "32.0.203.280"
49
49
 
50
50
  lemonade_install_dir = Path(__file__).parent.parent.parent
51
- DEFAULT_QUARK_VERSION = "quark-0.6.0"
52
- DEFAULT_QUARK_DIR = os.path.join(
53
- lemonade_install_dir, "install", "quark", DEFAULT_QUARK_VERSION
54
- )
55
51
 
56
52
  # List of supported Ryzen AI processor series (can be extended in the future)
57
53
  SUPPORTED_RYZEN_AI_SERIES = ["300"]
@@ -177,7 +173,7 @@ def _get_ryzenai_version_info(device=None):
177
173
  f"{e}\n Please install lemonade-sdk with "
178
174
  "one of the oga extras, for example:\n"
179
175
  "pip install lemonade-sdk[dev,oga-cpu]\n"
180
- "See https://lemonade_server.ai/install_options.html for details"
176
+ "See https://lemonade-server.ai/install_options.html for details"
181
177
  ) from e
182
178
 
183
179
 
@@ -445,18 +441,18 @@ class Install:
445
441
  "variable (e.g., Ryzen AI uses environment variable OGA_TOKEN).",
446
442
  )
447
443
 
448
- parser.add_argument(
449
- "--quark",
450
- help="Install Quark Quantization tool for LLMs",
451
- choices=["0.6.0"],
452
- )
453
-
454
444
  parser.add_argument(
455
445
  "--llamacpp",
456
446
  help="Install llama.cpp binaries with specified backend",
457
447
  choices=["rocm", "vulkan"],
458
448
  )
459
449
 
450
+ parser.add_argument(
451
+ "--override",
452
+ action="store_true",
453
+ help="Override the deprecation error to use legacy tools.",
454
+ )
455
+
460
456
  return parser
461
457
 
462
458
  @staticmethod
@@ -637,7 +633,7 @@ class Install:
637
633
  return file
638
634
 
639
635
  @staticmethod
640
- def _install_ryzenai(ryzenai, build_model, yes, token):
636
+ def _install_ryzenai(ryzenai, build_model, yes, token, override=False):
641
637
  # Check if the processor is supported before proceeding
642
638
  check_ryzen_ai_processor()
643
639
 
@@ -654,6 +650,9 @@ class Install:
654
650
  + "=" * 80
655
651
  + "\n"
656
652
  )
653
+ if not override:
654
+ raise ValueError(warning_msg)
655
+
657
656
  print(warning_msg)
658
657
 
659
658
  # Delete any previous Ryzen AI installation in this environment
@@ -715,36 +714,6 @@ class Install:
715
714
  except IOError as e:
716
715
  print(f"An error occurred while writing {version_info_path}: {e}")
717
716
 
718
- @staticmethod
719
- def _install_quark(quark):
720
- quark_install_dir = os.path.join(lemonade_install_dir, "install", "quark")
721
- os.makedirs(quark_install_dir, exist_ok=True)
722
-
723
- # Install Quark utilities
724
- quark_url = (
725
- f"https://www.xilinx.com/bin/public/openDownload?filename=quark-{quark}.zip"
726
- )
727
- quark_path = download_and_extract_package(
728
- url=quark_url,
729
- version=quark,
730
- install_dir=quark_install_dir,
731
- package_name="quark",
732
- )
733
- # Install Quark wheel
734
- wheel_url = (
735
- "https://www.xilinx.com/bin/public/openDownload?"
736
- f"filename=quark-{quark}-py3-none-any.whl"
737
- )
738
- wheel_path = os.path.join(quark_install_dir, f"quark-{quark}-py3-none-any.whl")
739
- print(f"\nInstalling Quark wheel from {wheel_url}")
740
- download_file(wheel_url, wheel_path, "wheel file")
741
-
742
- install_cmd = f"{sys.executable} -m pip install --no-deps {wheel_path}"
743
- subprocess.run(install_cmd, check=True, shell=True)
744
- os.remove(wheel_path)
745
-
746
- print(f"\nQuark installed successfully at: {quark_path}")
747
-
748
717
  @staticmethod
749
718
  def _install_llamacpp(backend):
750
719
  """
@@ -762,22 +731,19 @@ class Install:
762
731
  self,
763
732
  ryzenai: Optional[str] = None,
764
733
  build_model: Optional[str] = None,
765
- quark: Optional[str] = None,
766
734
  llamacpp: Optional[str] = None,
767
735
  yes: bool = False,
768
736
  token: Optional[str] = None,
737
+ override: bool = False,
769
738
  ):
770
- if ryzenai is None and quark is None and llamacpp is None:
739
+ if ryzenai is None and llamacpp is None:
771
740
  raise ValueError(
772
741
  "You must select something to install, "
773
- "for example `--ryzenai`, `--quark`, or `--llamacpp`"
742
+ "for example `--ryzenai` or `--llamacpp`"
774
743
  )
775
744
 
776
745
  if ryzenai is not None:
777
- self._install_ryzenai(ryzenai, build_model, yes, token)
778
-
779
- if quark is not None:
780
- self._install_quark(quark)
746
+ self._install_ryzenai(ryzenai, build_model, yes, token, override)
781
747
 
782
748
  if llamacpp is not None:
783
749
  self._install_llamacpp(llamacpp)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lemonade-sdk
3
- Version: 8.1.7
3
+ Version: 8.1.9
4
4
  Summary: Lemonade SDK: Your LLM Aide for Validation and Deployment
5
5
  Author-email: lemonade@amd.com
6
6
  Requires-Python: >=3.10, <3.14
@@ -16,7 +16,7 @@ Requires-Dist: numpy
16
16
  Requires-Dist: fasteners
17
17
  Requires-Dist: GitPython>=3.1.40
18
18
  Requires-Dist: psutil>=6.1.1
19
- Requires-Dist: wmi
19
+ Requires-Dist: wmi; platform_system == "Windows"
20
20
  Requires-Dist: py-cpuinfo
21
21
  Requires-Dist: pytz
22
22
  Requires-Dist: zstandard
@@ -45,42 +45,6 @@ Requires-Dist: human-eval-windows==1.0.4; extra == "dev"
45
45
  Requires-Dist: lm-eval[api]; extra == "dev"
46
46
  Provides-Extra: model-generate
47
47
  Requires-Dist: model-generate==1.5.0; (platform_system == "Windows" and python_version == "3.10") and extra == "model-generate"
48
- Provides-Extra: oga-hybrid
49
- Requires-Dist: lemonade-sdk[oga-ryzenai]; extra == "oga-hybrid"
50
- Provides-Extra: oga-unified
51
- Requires-Dist: lemonade-sdk[oga-ryzenai]; extra == "oga-unified"
52
- Provides-Extra: oga-hybrid-minimal
53
- Requires-Dist: lemonade-sdk[oga-ryzenai]; extra == "oga-hybrid-minimal"
54
- Provides-Extra: oga-cpu-minimal
55
- Requires-Dist: lemonade-sdk[oga-cpu]; extra == "oga-cpu-minimal"
56
- Provides-Extra: oga-npu-minimal
57
- Requires-Dist: lemonade-sdk[oga-ryzenai]; extra == "oga-npu-minimal"
58
- Provides-Extra: llm
59
- Requires-Dist: lemonade-sdk[dev]; extra == "llm"
60
- Provides-Extra: llm-oga-cpu
61
- Requires-Dist: lemonade-sdk[dev,oga-cpu]; extra == "llm-oga-cpu"
62
- Provides-Extra: llm-oga-npu
63
- Requires-Dist: onnx==1.16.0; extra == "llm-oga-npu"
64
- Requires-Dist: onnxruntime==1.18.0; extra == "llm-oga-npu"
65
- Requires-Dist: numpy==1.26.4; extra == "llm-oga-npu"
66
- Requires-Dist: protobuf>=6.30.1; extra == "llm-oga-npu"
67
- Requires-Dist: lemonade-sdk[dev]; extra == "llm-oga-npu"
68
- Provides-Extra: llm-oga-hybrid
69
- Requires-Dist: onnx==1.16.1; extra == "llm-oga-hybrid"
70
- Requires-Dist: numpy==1.26.4; extra == "llm-oga-hybrid"
71
- Requires-Dist: protobuf>=6.30.1; extra == "llm-oga-hybrid"
72
- Provides-Extra: llm-oga-unified
73
- Requires-Dist: lemonade-sdk[dev,llm-oga-hybrid]; extra == "llm-oga-unified"
74
- Provides-Extra: llm-oga-igpu
75
- Requires-Dist: onnxruntime-genai-directml==0.6.0; extra == "llm-oga-igpu"
76
- Requires-Dist: onnxruntime-directml<1.22.0,>=1.19.0; extra == "llm-oga-igpu"
77
- Requires-Dist: transformers<4.45.0; extra == "llm-oga-igpu"
78
- Requires-Dist: lemonade-sdk[dev]; extra == "llm-oga-igpu"
79
- Provides-Extra: llm-oga-cuda
80
- Requires-Dist: onnxruntime-genai-cuda==0.8.2; extra == "llm-oga-cuda"
81
- Requires-Dist: onnxruntime-gpu>=1.22.0; extra == "llm-oga-cuda"
82
- Requires-Dist: transformers<=4.51.3; extra == "llm-oga-cuda"
83
- Requires-Dist: lemonade-sdk[dev]; extra == "llm-oga-cuda"
84
48
  Dynamic: author-email
85
49
  Dynamic: description
86
50
  Dynamic: description-content-type
@@ -94,41 +58,29 @@ Dynamic: summary
94
58
 
95
59
  <p align="center">
96
60
  <a href="https://discord.gg/5xXzkMu8Zk">
97
- <img src="https://img.shields.io/badge/Discord-7289DA?logo=discord&logoColor=white" alt="Discord" />
98
- </a>
61
+ <img src="https://img.shields.io/badge/Discord-7289DA?logo=discord&logoColor=white" alt="Discord" /></a>
99
62
  <a href="https://github.com/lemonade-sdk/lemonade/tree/main/test" title="Check out our tests">
100
- <img src="https://github.com/lemonade-sdk/lemonade/actions/workflows/test_lemonade.yml/badge.svg" alt="Lemonade tests" />
101
- </a>
63
+ <img src="https://github.com/lemonade-sdk/lemonade/actions/workflows/test_lemonade.yml/badge.svg" alt="Lemonade tests" /></a>
102
64
  <a href="docs/README.md#installation" title="Check out our instructions">
103
- <img src="https://img.shields.io/badge/Windows-11-0078D6?logo=windows&logoColor=white" alt="Windows 11" />
104
- </a>
65
+ <img src="https://img.shields.io/badge/Windows-11-0078D6?logo=windows&logoColor=white" alt="Windows 11" /></a>
105
66
  <a href="https://lemonade-server.ai/#linux" title="Ubuntu 24.04 & 25.04 Supported">
106
- <img src="https://img.shields.io/badge/Ubuntu-24.04%20%7C%2025.04-E95420?logo=ubuntu&logoColor=white" alt="Ubuntu 24.04 | 25.04" />
107
- </a>
67
+ <img src="https://img.shields.io/badge/Ubuntu-24.04%20%7C%2025.04-E95420?logo=ubuntu&logoColor=white" alt="Ubuntu 24.04 | 25.04" /></a>
108
68
  <a href="docs/README.md#installation" title="Check out our instructions">
109
- <img src="https://img.shields.io/badge/Python-3.10--3.13-blue?logo=python&logoColor=white" alt="Made with Python" />
110
- </a>
69
+ <img src="https://img.shields.io/badge/Python-3.10--3.13-blue?logo=python&logoColor=white" alt="Made with Python" /></a>
111
70
  <a href="https://github.com/lemonade-sdk/lemonade/blob/main/docs/contribute.md" title="Contribution Guide">
112
- <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs Welcome" />
113
- </a>
71
+ <img src="https://img.shields.io/badge/PRs-welcome-brightgreen.svg" alt="PRs Welcome" /></a>
114
72
  <a href="https://github.com/lemonade-sdk/lemonade/releases/latest" title="Download the latest release">
115
- <img src="https://img.shields.io/github/v/release/lemonade-sdk/lemonade?include_prereleases" alt="Latest Release" />
116
- </a>
73
+ <img src="https://img.shields.io/github/v/release/lemonade-sdk/lemonade?include_prereleases" alt="Latest Release" /></a>
117
74
  <a href="https://tooomm.github.io/github-release-stats/?username=lemonade-sdk&repository=lemonade">
118
- <img src="https://img.shields.io/github/downloads/lemonade-sdk/lemonade/total.svg" alt="GitHub downloads" />
119
- </a>
75
+ <img src="https://img.shields.io/github/downloads/lemonade-sdk/lemonade/total.svg" alt="GitHub downloads" /></a>
120
76
  <a href="https://github.com/lemonade-sdk/lemonade/issues">
121
- <img src="https://img.shields.io/github/issues/lemonade-sdk/lemonade" alt="GitHub issues" />
122
- </a>
77
+ <img src="https://img.shields.io/github/issues/lemonade-sdk/lemonade" alt="GitHub issues" /></a>
123
78
  <a href="https://github.com/lemonade-sdk/lemonade/blob/main/LICENSE">
124
- <img src="https://img.shields.io/badge/License-Apache-yellow.svg" alt="License: Apache" />
125
- </a>
79
+ <img src="https://img.shields.io/badge/License-Apache-yellow.svg" alt="License: Apache" /></a>
126
80
  <a href="https://github.com/psf/black">
127
- <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black" />
128
- </a>
81
+ <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black" /></a>
129
82
  <a href="https://star-history.com/#lemonade-sdk/lemonade">
130
- <img src="https://img.shields.io/badge/Star%20History-View-brightgreen" alt="Star History Chart" />
131
- </a>
83
+ <img src="https://img.shields.io/badge/Star%20History-View-brightgreen" alt="Star History Chart" /></a>
132
84
  </p>
133
85
  <p align="center">
134
86
  <img src="https://github.com/lemonade-sdk/assets/blob/main/docs/banner.png?raw=true" alt="Lemonade Banner" />
@@ -156,7 +108,7 @@ Startups such as [Styrk AI](https://styrk.ai/styrk-ai-and-amd-guardrails-for-you
156
108
  ### Use it with your favorite OpenAI-compatible app!
157
109
 
158
110
  <p align="center">
159
- <a href="https://lemonade-server.ai/docs/server/apps/open-webui/" title="Open WebUI" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/openwebui.jpg" alt="Open WebUI" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/continue/" title="Continue" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/continue_dev.png" alt="Continue" width="60" /></a>&nbsp;&nbsp;<a href="https://github.com/amd/gaia" title="Gaia" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/gaia.ico" alt="Gaia" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/anythingLLM/" title="AnythingLLM" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/anything_llm.png" alt="AnythingLLM" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/ai-dev-gallery/" title="AI Dev Gallery" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/ai_dev_gallery.webp" alt="AI Dev Gallery" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/lm-eval/" title="LM-Eval" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/lm_eval.png" alt="LM-Eval" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/codeGPT/" title="CodeGPT" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/codegpt.jpg" alt="CodeGPT" width="60" /></a>&nbsp;&nbsp;<a href="https://github.com/lemonade-sdk/lemonade/blob/main/docs/server/apps/ai-toolkit.md" title="AI Toolkit" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/ai_toolkit.png" alt="AI Toolkit" width="60" /></a>
111
+ <a href="https://lemonade-server.ai/docs/server/apps/open-webui/" title="Open WebUI" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/openwebui.jpg" alt="Open WebUI" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/continue/" title="Continue" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/continue_dev.png" alt="Continue" width="60" /></a>&nbsp;&nbsp;<a href="https://github.com/amd/gaia" title="Gaia" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/gaia.ico" alt="Gaia" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/anythingLLM/" title="AnythingLLM" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/anything_llm.png" alt="AnythingLLM" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/ai-dev-gallery/" title="AI Dev Gallery" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/ai_dev_gallery.webp" alt="AI Dev Gallery" width="60" /></a>&nbsp;&nbsp;<a href="https://lemonade-server.ai/docs/server/apps/lm-eval/" title="LM-Eval" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/lm_eval.png" alt="LM-Eval" width="60" /></a>&nbsp;&nbsp;<a href="https://github.com/lemonade-sdk/lemonade-arcade" title="Lemonade Arcade" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/lemonade-arcade/refs/heads/main/docs/assets/favicon.ico" alt="Lemonade Arcade" width="60" /></a>&nbsp;&nbsp;<a href="https://github.com/lemonade-sdk/lemonade/blob/main/docs/server/apps/ai-toolkit.md" title="AI Toolkit" target="_blank"><img src="https://raw.githubusercontent.com/lemonade-sdk/assets/refs/heads/main/partner_logos/ai_toolkit.png" alt="AI Toolkit" width="60" /></a>
160
112
  </p>
161
113
 
162
114
  > [!TIP]
@@ -227,7 +179,7 @@ Lemonade supports the following configurations, while also making it easy to swi
227
179
  </tr>
228
180
  <tr>
229
181
  <td><b>gfx120X</b> (RDNA4)</td>
230
- <td>Windows only</td>
182
+ <td>Windows, Ubuntu</td>
231
183
  <td>Radeon AI PRO R9700, RX 9070 XT/GRE/9070, RX 9060 XT</td>
232
184
  </tr>
233
185
  <tr>
@@ -1,10 +1,10 @@
1
1
  lemonade/__init__.py,sha256=W1Qk7r0rnQqFhPNHp6BIBT_q-OH3s-8Q_POoVfAmKW0,117
2
2
  lemonade/api.py,sha256=Oc4yBA3LZg8FrTsbuDq1p9-XE74pqNnIEUhXyKa7qg8,5786
3
3
  lemonade/cache.py,sha256=5iZbk273TiTMqK_vdzPOPYTo6VsWW2gNByOISA9zi1w,3002
4
- lemonade/cli.py,sha256=9Pcs3PcrWC2F8_pcBaz09xHUICIJTvpemBdPGyXkjIk,4395
4
+ lemonade/cli.py,sha256=qU5bW7RQAUKNSpvrhVyzn68NMxyi-336Ke_JU4bsv1Q,5708
5
5
  lemonade/sequence.py,sha256=KSH7BPsiyDKsOsg_ziQKEGsDwMmuO_YbgPRBxkZd0pw,13267
6
6
  lemonade/state.py,sha256=sdSezla7Cd7KYL90xY3p9kcNV4ndSyN6UvNLOr3vBMA,5261
7
- lemonade/version.py,sha256=DSjpcTXEMbKTSEhH-ChqB5reU3Hdp38wfe3HkEnrtRQ,22
7
+ lemonade/version.py,sha256=nNxNovCuweKgLzK71oDtPCagHKqrBZW7fNRdrO5VFWA,22
8
8
  lemonade/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  lemonade/common/build.py,sha256=zTb0m1-kuUx6zw5QHp2SNnVuN6jOTMQ2FCdj9iH374U,6140
10
10
  lemonade/common/cli_helpers.py,sha256=hjBfXrTtFl8gmCFlL-ksviXR0mOcdPtTWVNKoEp3PG4,4993
@@ -17,6 +17,8 @@ lemonade/common/status.py,sha256=xSOZN508cdRtrs1HVyr9zmASYg69EsZBLSs0lroLoCM,165
17
17
  lemonade/common/system_info.py,sha256=pn-k3zMQCbt5cu3aHXa4cENgrubOK97gs9PYdGPsFXA,28405
18
18
  lemonade/common/test_helpers.py,sha256=Gwk-pa_6xYAo2oro-2EJNfuouAfw8k_brCbcMC-E-r0,758
19
19
  lemonade/profilers/__init__.py,sha256=JKVonvJ4XZ9_6sKXPWsiMLQCNyzQOxhQw5BEHR1qOfU,31
20
+ lemonade/profilers/agt_power.py,sha256=t_37VEg8LPapjSKSjJln-jFznZtTIf5UpzlAXcVGOrc,16771
21
+ lemonade/profilers/hwinfo_power.py,sha256=UQr-EHq7B4T-IvzmErCRK0-QxcFnho4ftCaWy5p8Qvo,15819
20
22
  lemonade/profilers/memory_tracker.py,sha256=1iuKt0FmNVYLDnOc-oZM8dX9TUksvoxO0m2EoYWjhYQ,9367
21
23
  lemonade/profilers/profiler.py,sha256=Y5FSbc386bMlTVbqCuya9pYrso5aTthxahR1V_ZKQ9E,1902
22
24
  lemonade/tools/__init__.py,sha256=_6xRc-FHxmujoLjLjWtpYrWYEXtCSneSy-5ya01kyPk,53
@@ -34,45 +36,42 @@ lemonade/tools/huggingface/load.py,sha256=KsSGOBBD-tNEIfYC8mCWV_jpnkjHMhN3juVmC1
34
36
  lemonade/tools/huggingface/utils.py,sha256=j1S-IgjDsznUIVwkHSqqChmFyqIx9f3WcEelzohWwvU,13955
35
37
  lemonade/tools/llamacpp/bench.py,sha256=1fkE02ecg-jRk92i5dTAXz6re14WH8bd-Z9l-m3lbDA,4844
36
38
  lemonade/tools/llamacpp/load.py,sha256=DFCvQN548Ch9H8U_rHOiYviinzw6vixb5-V7xLj7XE4,6499
37
- lemonade/tools/llamacpp/utils.py,sha256=96POJXoIBE_zLArusiOrgyCcz8D5vR3IuXkMzyg79CU,32608
39
+ lemonade/tools/llamacpp/utils.py,sha256=nl11DRJCzcDV7OcAJtA0YRVxStdBvcnLZbhDhUrN1So,33041
38
40
  lemonade/tools/oga/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
41
  lemonade/tools/oga/bench.py,sha256=PJXv4UchcS2YPwijNzef8DY4DSAKYxIYY1ycHuH3T34,5005
40
- lemonade/tools/oga/load.py,sha256=BH5ChYbZgeP_ZN4E6HoboJD3kZcUIAPgPEVbgUZpVjQ,33778
42
+ lemonade/tools/oga/load.py,sha256=x-A-nhoni-WyDpVCLcWRAMfs5ouac9MJzxT-rsnLPw8,34226
41
43
  lemonade/tools/oga/utils.py,sha256=F8UVLKlfYcLa2SUqlehar8-jaX2Aw4u58DjHNNvLdOA,17675
42
- lemonade/tools/quark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- lemonade/tools/quark/quark_load.py,sha256=FJ4LJKTToZbHHWVEOBLadae1a3jCnnY4KvXySHbkJMA,5589
44
- lemonade/tools/quark/quark_quantize.py,sha256=hwoaXhpBIORvJ16MvewphPkaDEQn3BAgXq5o82Gc-_s,16599
45
44
  lemonade/tools/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
45
  lemonade/tools/report/llm_report.py,sha256=bVHhwCINA-Ok2EdSwAsLubsc83N3KWOVuwTguw7jDcE,6676
47
- lemonade/tools/report/table.py,sha256=ssqy1bZqF-wptNzKEOj6_9REtCNZyXO8R5vakAtg3R4,27973
46
+ lemonade/tools/report/table.py,sha256=Kv_Epd8a6KIrdzSC2EgIl6uTKw7E5eMq10Tg16O0WxM,27996
48
47
  lemonade/tools/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
- lemonade/tools/server/llamacpp.py,sha256=w-M0JXrgXVpfICnHBHhJm_yBshfwZ8zge-e1o1kH0R4,8751
50
- lemonade/tools/server/serve.py,sha256=YVsO7m9E1OsQtbcjkv_1ir8oCSAdr0IXGNEvJ6FKamw,60311
48
+ lemonade/tools/server/llamacpp.py,sha256=8HdTkrU2ht8L1ldXqkfYfYhXiA8TvySuaslinAMqr-c,9002
49
+ lemonade/tools/server/serve.py,sha256=gwKPs-r-bfQsyCkVxzVyTp0SyNYVqqfMeeUFQ9TivwM,61638
51
50
  lemonade/tools/server/tool_calls.py,sha256=xrAlQwKG-nv2xLlf8f9CDSaUbyMn8ZtHkds9iZLG9K8,5230
52
51
  lemonade/tools/server/tray.py,sha256=a9z6hdqlfj91H00j6hAExRPQkzWHhE3dnqSumzEgq0U,19599
53
52
  lemonade/tools/server/webapp.py,sha256=8Das5yXOaSBLZmSZ_eddJajQFxBhvl5D6GI_hHlGbE0,1040
54
- lemonade/tools/server/wrapped_server.py,sha256=-knOr2ycmrebVPYrOlCNRJH0ySZPnVlWzbKYLsfTRhE,16441
53
+ lemonade/tools/server/wrapped_server.py,sha256=DlzsGUwLQzjOFRfTTxfnhvmM_9lvAki96jWIAz7Czds,16713
55
54
  lemonade/tools/server/static/favicon.ico,sha256=hMmP9qGJNeZ0mFS86JIqPbZstXMZn0Z76_HfHQpREAU,126745
56
- lemonade/tools/server/static/styles.css,sha256=5HQQCpm8N_fzLcolPiDuhyZw_5nbO8aIl60xAn4RKmg,43385
57
- lemonade/tools/server/static/webapp.html,sha256=FX2MZUsljfgxxuF12KBdgvNkso_z-sHewWc0SEGGcGM,18138
58
- lemonade/tools/server/static/js/chat.js,sha256=BTvREuEt0NrN8qhAuda5tTAoUN6tbsoukevA-zyTrwQ,27193
55
+ lemonade/tools/server/static/styles.css,sha256=SYEK4rC-MdpkTj31gxNl9Kb3hCNd1Fpq-EGnRMTjVe8,45362
56
+ lemonade/tools/server/static/webapp.html,sha256=j7A8SOwbY_GfOSkOMV3JvXhOKY1iG70JYYuA3WdoWSQ,17856
57
+ lemonade/tools/server/static/js/chat.js,sha256=XpQSIn1TUra26tu2CtDyOayhXAbUEqzBK0oGtkCAu-s,39162
59
58
  lemonade/tools/server/static/js/model-settings.js,sha256=JXHeG7xVrRU181Hj7CZflERAi1Z6t-qwYFR4aH5nf5I,5820
60
- lemonade/tools/server/static/js/models.js,sha256=bbX7c8B59ioim86T3x9PFESvF8y3cHPYUO6nhc4SCDs,32500
61
- lemonade/tools/server/static/js/shared.js,sha256=4iqDNWiKEB7eYS4fdnTy-RwO_ksROrLYLmT2YSomG1M,17065
59
+ lemonade/tools/server/static/js/models.js,sha256=7bCJbvS8FWpj6f1ZOwM8pt6UOQueuiOGLG79qrs-C-A,35872
60
+ lemonade/tools/server/static/js/shared.js,sha256=mD03xqyMH1iQwH4pOq4IpDDaAX0z7YZY71gD8gufRAg,17487
62
61
  lemonade/tools/server/utils/port.py,sha256=J7-g-Aqygb50jNoHLhhRfBZVM-uhGlcB5-oYBAehvgw,2263
63
62
  lemonade/tools/server/utils/system_tray.py,sha256=b9lvNv9chJKQxvmH7qzAuUe6H9HsLu7pdHFqGlAJaL0,12654
64
63
  lemonade/tools/server/utils/thread.py,sha256=Z-PDzGcpgfN2qxTmtlROWqrUN0B2fXdPrqo_J10fR_w,2772
65
64
  lemonade_install/__init__.py,sha256=26zohKg2jgr_5y7tObduWMYQg8zCTWMZHL8lfi2zZVQ,40
66
- lemonade_install/install.py,sha256=onndA2a-ygyLtDfupI8JQFhU_XpK8McGZtGujFasXww,28304
67
- lemonade_sdk-8.1.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
68
- lemonade_sdk-8.1.7.dist-info/licenses/NOTICE.md,sha256=RSca9LE5e6pvdWA_LXAUCcACIHPmINKqkRX-AVRqBGo,3499
69
- lemonade_server/cli.py,sha256=GsYMg095XMADHjWr1ytLYvbbrtSDPwQJEUn0gI-W99o,19108
70
- lemonade_server/model_manager.py,sha256=xHbHo14q9EbueY6rxijFKUQtf4hgod0w9gBuPw2mVdk,18065
65
+ lemonade_install/install.py,sha256=Dow7kt-K9WI4PH15hBwkKtOxede3dAaOmH4I1y_P5H4,27008
66
+ lemonade_sdk-8.1.9.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
67
+ lemonade_sdk-8.1.9.dist-info/licenses/NOTICE.md,sha256=RSca9LE5e6pvdWA_LXAUCcACIHPmINKqkRX-AVRqBGo,3499
68
+ lemonade_server/cli.py,sha256=IsyWGDIeiN0MnIaBryLhArHhPj1HD52l6028dNHQCKc,19248
69
+ lemonade_server/model_manager.py,sha256=V8QRf1nlh3wAFtUHoSF_JeAXeR7sfaZE1uTfppcIfcw,20492
71
70
  lemonade_server/pydantic_models.py,sha256=49MyOlb5feLUlKsGcI75tWaflWckrItqcSVkdCY4e3A,3269
72
- lemonade_server/server_models.json,sha256=DAdG4ebIt5Dy5MM3kmXn1pO0XbNMph1gdpzbacBDVuc,11664
71
+ lemonade_server/server_models.json,sha256=0H_G6Jw6Yuz6t0RZnFnq0SbBCsw_cQLe9j24TkyF2eI,12344
73
72
  lemonade_server/settings.py,sha256=6nsmPLFJD-UokQDmlx9ZBYMbpnn48So_PuBGWP7Fmfg,1299
74
- lemonade_sdk-8.1.7.dist-info/METADATA,sha256=onbpcmKIyz0x7FmhWIzGFD0YnyOoOTUTCxtcxSno1gA,16852
75
- lemonade_sdk-8.1.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
76
- lemonade_sdk-8.1.7.dist-info/entry_points.txt,sha256=7sRvpNhi1E7amnM7RZo57e8yFF9iA5uuRaIeJ1Xre6w,193
77
- lemonade_sdk-8.1.7.dist-info/top_level.txt,sha256=10ap5GNiPhalO4V50LRoxA1FqRT9g3Xkia6BITu880k,42
78
- lemonade_sdk-8.1.7.dist-info/RECORD,,
73
+ lemonade_sdk-8.1.9.dist-info/METADATA,sha256=rG009a2eVI1apZTBLwIcyQNwdYuVmX33naZwN8Rhbbs,15022
74
+ lemonade_sdk-8.1.9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
75
+ lemonade_sdk-8.1.9.dist-info/entry_points.txt,sha256=7sRvpNhi1E7amnM7RZo57e8yFF9iA5uuRaIeJ1Xre6w,193
76
+ lemonade_sdk-8.1.9.dist-info/top_level.txt,sha256=10ap5GNiPhalO4V50LRoxA1FqRT9g3Xkia6BITu880k,42
77
+ lemonade_sdk-8.1.9.dist-info/RECORD,,
lemonade_server/cli.py CHANGED
@@ -197,15 +197,15 @@ def pull(
197
197
  for model_name in model_names:
198
198
  payload = {"model_name": model_name}
199
199
 
200
- if checkpoint and recipe:
201
- # Add the parameters for registering a new model
202
- payload["checkpoint"] = checkpoint
203
- payload["recipe"] = recipe
204
-
205
- if reasoning:
206
- payload["reasoning"] = reasoning
207
- if mmproj:
208
- payload["mmproj"] = mmproj
200
+ # Add the parameters to the payload
201
+ for key, value in [
202
+ ("checkpoint", checkpoint),
203
+ ("recipe", recipe),
204
+ ("reasoning", reasoning),
205
+ ("mmproj", mmproj),
206
+ ]:
207
+ if value:
208
+ payload[key] = value
209
209
 
210
210
  # Install the model
211
211
  pull_response = requests.post(f"{base_url}/pull", json=payload)
@@ -225,6 +225,9 @@ def pull(
225
225
  recipe=recipe,
226
226
  reasoning=reasoning,
227
227
  mmproj=mmproj,
228
+ # The pull command will download an upgraded model if available, even
229
+ # if we already have a local copy of the model
230
+ do_not_upgrade=False,
228
231
  )
229
232
 
230
233
 
@@ -201,6 +201,54 @@ class ModelManager:
201
201
  reasoning=reasoning,
202
202
  )
203
203
  else:
204
+ # Model is already registered - check if trying to register with different parameters
205
+ existing_model = self.supported_models[model]
206
+ existing_checkpoint = existing_model.get("checkpoint")
207
+ existing_recipe = existing_model.get("recipe")
208
+ existing_reasoning = "reasoning" in existing_model.get("labels", [])
209
+ existing_mmproj = existing_model.get("mmproj", "")
210
+
211
+ # Compare parameters
212
+ checkpoint_differs = checkpoint and checkpoint != existing_checkpoint
213
+ recipe_differs = recipe and recipe != existing_recipe
214
+ reasoning_differs = reasoning and reasoning != existing_reasoning
215
+ mmproj_differs = mmproj and mmproj != existing_mmproj
216
+
217
+ if (
218
+ checkpoint_differs
219
+ or recipe_differs
220
+ or reasoning_differs
221
+ or mmproj_differs
222
+ ):
223
+ conflicts = []
224
+ if checkpoint_differs:
225
+ conflicts.append(
226
+ f"checkpoint (existing: '{existing_checkpoint}', new: '{checkpoint}')"
227
+ )
228
+ if recipe_differs:
229
+ conflicts.append(
230
+ f"recipe (existing: '{existing_recipe}', new: '{recipe}')"
231
+ )
232
+ if reasoning_differs:
233
+ conflicts.append(
234
+ f"reasoning (existing: {existing_reasoning}, new: {reasoning})"
235
+ )
236
+ if mmproj_differs:
237
+ conflicts.append(
238
+ f"mmproj (existing: '{existing_mmproj}', new: '{mmproj}')"
239
+ )
240
+
241
+ conflict_details = ", ".join(conflicts)
242
+
243
+ additional_suggestion = ""
244
+ if model.startswith("user."):
245
+ additional_suggestion = f" or delete the existing model first using `lemonade-server delete {model}`"
246
+
247
+ raise ValueError(
248
+ f"Model {model} is already registered with a different configuration. "
249
+ f"Conflicting parameters: {conflict_details}. "
250
+ f"Please use a different model name{additional_suggestion}."
251
+ )
204
252
  new_registration_model_config = None
205
253
 
206
254
  # Download the model