lemonade-sdk 8.1.12__py3-none-any.whl → 8.2.0__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.
- lemonade/common/system_info.py +0 -26
- lemonade/tools/flm/utils.py +70 -22
- lemonade/tools/llamacpp/load.py +10 -1
- lemonade/tools/llamacpp/utils.py +82 -8
- lemonade/tools/oga/load.py +38 -142
- lemonade/tools/oga/migration.py +403 -0
- lemonade/tools/server/llamacpp.py +20 -1
- lemonade/tools/server/serve.py +334 -16
- lemonade/tools/server/static/js/models.js +416 -18
- lemonade/tools/server/static/js/shared.js +41 -4
- lemonade/tools/server/static/styles.css +204 -0
- lemonade/tools/server/static/webapp.html +32 -0
- lemonade/version.py +1 -1
- lemonade_install/install.py +33 -579
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/METADATA +4 -3
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/RECORD +24 -23
- lemonade_server/cli.py +10 -0
- lemonade_server/model_manager.py +172 -11
- lemonade_server/server_models.json +94 -71
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/WHEEL +0 -0
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/entry_points.txt +0 -0
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/licenses/LICENSE +0 -0
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/licenses/NOTICE.md +0 -0
- {lemonade_sdk-8.1.12.dist-info → lemonade_sdk-8.2.0.dist-info}/top_level.txt +0 -0
|
@@ -1288,6 +1288,62 @@ button:disabled {
|
|
|
1288
1288
|
transform: translateY(-1px);
|
|
1289
1289
|
box-shadow: 0 2px 8px rgba(91, 141, 184, 0.3);
|
|
1290
1290
|
}
|
|
1291
|
+
.checkpoint-input-group {
|
|
1292
|
+
display: flex;
|
|
1293
|
+
align-items: stretch;
|
|
1294
|
+
flex: 1;
|
|
1295
|
+
border-radius: 6px;
|
|
1296
|
+
overflow: hidden;
|
|
1297
|
+
transition: box-shadow 0.2s ease;
|
|
1298
|
+
min-width: 0;
|
|
1299
|
+
}
|
|
1300
|
+
|
|
1301
|
+
.checkpoint-input-group:focus-within {
|
|
1302
|
+
box-shadow: 0 2px 12px rgba(230,184,0,0.25);
|
|
1303
|
+
}
|
|
1304
|
+
|
|
1305
|
+
.checkpoint-input-group #register-checkpoint {
|
|
1306
|
+
border-radius: 6px 0 0 6px;
|
|
1307
|
+
border: 1px solid #d5d5d5;
|
|
1308
|
+
border-right: none;
|
|
1309
|
+
padding: 0.6em 0.8em;
|
|
1310
|
+
font-size: 0.95em;
|
|
1311
|
+
background: #fff;
|
|
1312
|
+
color: #222;
|
|
1313
|
+
flex: 1;
|
|
1314
|
+
transition: border-color 0.2s ease, box-shadow 0.2s ease;
|
|
1315
|
+
outline: none;
|
|
1316
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.06);
|
|
1317
|
+
box-sizing: border-box;
|
|
1318
|
+
min-width: 0;
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
.checkpoint-input-group #register-checkpoint:focus {
|
|
1322
|
+
border-color: #e6b800;
|
|
1323
|
+
box-shadow: 0 2px 12px rgba(230,184,0,0.25);
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1326
|
+
.folder-select-btn {
|
|
1327
|
+
background: #f8f9fa;
|
|
1328
|
+
border: 1px solid #d5d5d5;
|
|
1329
|
+
border-left: none;
|
|
1330
|
+
border-radius: 0 6px 6px 0;
|
|
1331
|
+
padding: 0.6em 0.8em;
|
|
1332
|
+
cursor: pointer;
|
|
1333
|
+
transition: all 0.2s ease;
|
|
1334
|
+
font-size: 1rem;
|
|
1335
|
+
color: #666;
|
|
1336
|
+
min-width: 48px;
|
|
1337
|
+
display: flex;
|
|
1338
|
+
align-items: center;
|
|
1339
|
+
justify-content: center;
|
|
1340
|
+
}
|
|
1341
|
+
|
|
1342
|
+
.folder-select-btn:hover {
|
|
1343
|
+
background: #e9ecef;
|
|
1344
|
+
color: #333;
|
|
1345
|
+
}
|
|
1346
|
+
/* */
|
|
1291
1347
|
|
|
1292
1348
|
#register-mmproj, #register-checkpoint {
|
|
1293
1349
|
border-radius: 6px;
|
|
@@ -1960,6 +2016,154 @@ button:disabled {
|
|
|
1960
2016
|
opacity: 0.8;
|
|
1961
2017
|
}
|
|
1962
2018
|
|
|
2019
|
+
/* Migration banner - reuses error-banner structure with warning color */
|
|
2020
|
+
.migration-banner {
|
|
2021
|
+
position: fixed;
|
|
2022
|
+
top: 10px;
|
|
2023
|
+
left: 50%;
|
|
2024
|
+
transform: translateX(-50%);
|
|
2025
|
+
background-color: #ffa500;
|
|
2026
|
+
color: #222;
|
|
2027
|
+
padding: 0.6em 1.2em;
|
|
2028
|
+
border-radius: 6px;
|
|
2029
|
+
box-shadow: 0 2px 8px rgba(0,0,0,0.2);
|
|
2030
|
+
z-index: 10000;
|
|
2031
|
+
font-weight: 600;
|
|
2032
|
+
display: none;
|
|
2033
|
+
animation: fadeIn 0.2s ease;
|
|
2034
|
+
align-items: center;
|
|
2035
|
+
gap: 0.8em;
|
|
2036
|
+
}
|
|
2037
|
+
|
|
2038
|
+
.migration-action-btn {
|
|
2039
|
+
background: #222;
|
|
2040
|
+
color: #ffa500;
|
|
2041
|
+
border: none;
|
|
2042
|
+
padding: 0.4em 0.8em;
|
|
2043
|
+
border-radius: 4px;
|
|
2044
|
+
cursor: pointer;
|
|
2045
|
+
font-weight: 600;
|
|
2046
|
+
transition: background 0.2s;
|
|
2047
|
+
}
|
|
2048
|
+
|
|
2049
|
+
.migration-action-btn:hover {
|
|
2050
|
+
background: #444;
|
|
2051
|
+
}
|
|
2052
|
+
|
|
2053
|
+
.migration-banner .close-btn {
|
|
2054
|
+
background: none;
|
|
2055
|
+
border: none;
|
|
2056
|
+
color: #222;
|
|
2057
|
+
font-size: 1.2em;
|
|
2058
|
+
margin-left: 0.8em;
|
|
2059
|
+
cursor: pointer;
|
|
2060
|
+
padding: 0;
|
|
2061
|
+
line-height: 1;
|
|
2062
|
+
}
|
|
2063
|
+
|
|
2064
|
+
/* Modal styles */
|
|
2065
|
+
.modal {
|
|
2066
|
+
position: fixed;
|
|
2067
|
+
z-index: 10001;
|
|
2068
|
+
left: 0;
|
|
2069
|
+
top: 0;
|
|
2070
|
+
width: 100%;
|
|
2071
|
+
height: 100%;
|
|
2072
|
+
background-color: rgba(0,0,0,0.5);
|
|
2073
|
+
display: flex;
|
|
2074
|
+
align-items: center;
|
|
2075
|
+
justify-content: center;
|
|
2076
|
+
}
|
|
2077
|
+
|
|
2078
|
+
.modal-content {
|
|
2079
|
+
background: #fff;
|
|
2080
|
+
border-radius: 8px;
|
|
2081
|
+
max-width: 600px;
|
|
2082
|
+
width: 90%;
|
|
2083
|
+
max-height: 80vh;
|
|
2084
|
+
display: flex;
|
|
2085
|
+
flex-direction: column;
|
|
2086
|
+
box-shadow: 0 4px 20px rgba(0,0,0,0.3);
|
|
2087
|
+
}
|
|
2088
|
+
|
|
2089
|
+
.modal-header {
|
|
2090
|
+
display: flex;
|
|
2091
|
+
justify-content: space-between;
|
|
2092
|
+
align-items: center;
|
|
2093
|
+
padding: 1.2rem 1.5rem;
|
|
2094
|
+
border-bottom: 1px solid #e0e0e0;
|
|
2095
|
+
}
|
|
2096
|
+
|
|
2097
|
+
.modal-header h2 {
|
|
2098
|
+
margin: 0;
|
|
2099
|
+
font-size: 1.3rem;
|
|
2100
|
+
}
|
|
2101
|
+
|
|
2102
|
+
.modal-close {
|
|
2103
|
+
background: none;
|
|
2104
|
+
border: none;
|
|
2105
|
+
font-size: 1.5rem;
|
|
2106
|
+
cursor: pointer;
|
|
2107
|
+
color: #666;
|
|
2108
|
+
padding: 0;
|
|
2109
|
+
}
|
|
2110
|
+
|
|
2111
|
+
.modal-body {
|
|
2112
|
+
padding: 1.5rem;
|
|
2113
|
+
overflow-y: auto;
|
|
2114
|
+
flex: 1;
|
|
2115
|
+
}
|
|
2116
|
+
|
|
2117
|
+
.migration-model-list {
|
|
2118
|
+
margin: 1rem 0;
|
|
2119
|
+
border: 1px solid #e0e0e0;
|
|
2120
|
+
border-radius: 4px;
|
|
2121
|
+
max-height: 300px;
|
|
2122
|
+
overflow-y: auto;
|
|
2123
|
+
}
|
|
2124
|
+
|
|
2125
|
+
.migration-model-item {
|
|
2126
|
+
padding: 0.75rem 1rem;
|
|
2127
|
+
border-bottom: 1px solid #f0f0f0;
|
|
2128
|
+
display: flex;
|
|
2129
|
+
justify-content: space-between;
|
|
2130
|
+
}
|
|
2131
|
+
|
|
2132
|
+
.migration-model-item:last-child {
|
|
2133
|
+
border-bottom: none;
|
|
2134
|
+
}
|
|
2135
|
+
|
|
2136
|
+
.migration-summary {
|
|
2137
|
+
margin-top: 1rem;
|
|
2138
|
+
padding: 0.75rem;
|
|
2139
|
+
background: #f8f9fa;
|
|
2140
|
+
border-radius: 4px;
|
|
2141
|
+
text-align: center;
|
|
2142
|
+
}
|
|
2143
|
+
|
|
2144
|
+
.modal-footer {
|
|
2145
|
+
padding: 1rem 1.5rem;
|
|
2146
|
+
border-top: 1px solid #e0e0e0;
|
|
2147
|
+
display: flex;
|
|
2148
|
+
justify-content: flex-end;
|
|
2149
|
+
gap: 0.75rem;
|
|
2150
|
+
}
|
|
2151
|
+
|
|
2152
|
+
.delete-btn {
|
|
2153
|
+
padding: 0.6em 1.5em;
|
|
2154
|
+
background: var(--danger-primary);
|
|
2155
|
+
color: white;
|
|
2156
|
+
border: none;
|
|
2157
|
+
border-radius: 4px;
|
|
2158
|
+
font-weight: 600;
|
|
2159
|
+
cursor: pointer;
|
|
2160
|
+
transition: background 0.2s;
|
|
2161
|
+
}
|
|
2162
|
+
|
|
2163
|
+
.delete-btn:hover {
|
|
2164
|
+
background: var(--danger-hover);
|
|
2165
|
+
}
|
|
2166
|
+
|
|
1963
2167
|
/* === Model Settings === */
|
|
1964
2168
|
.model-settings-container {
|
|
1965
2169
|
max-width: 600px;
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
<span id="error-banner-msg"></span>
|
|
30
30
|
<button class="close-btn" onclick="hideErrorBanner()">×</button>
|
|
31
31
|
</div>
|
|
32
|
+
<div id="migration-banner" class="migration-banner" style="display:none;">
|
|
33
|
+
<span id="migration-banner-msg"></span>
|
|
34
|
+
<button class="migration-action-btn" onclick="showMigrationModal()">Clean Up Now</button>
|
|
35
|
+
<button class="close-btn" onclick="hideMigrationBanner()">×</button>
|
|
36
|
+
</div>
|
|
32
37
|
<main class="main">
|
|
33
38
|
<div class="tab-content-wrapper">
|
|
34
39
|
<div class="tab-container">
|
|
@@ -207,7 +212,11 @@
|
|
|
207
212
|
Checkpoint
|
|
208
213
|
<span class="tooltip-icon" data-tooltip="Specify the model checkpoint path from Hugging Face (e.g., org-name/model-name:variant).">ⓘ</span>
|
|
209
214
|
</label>
|
|
215
|
+
<div class="checkpoint-input-group">
|
|
210
216
|
<input type="text" id="register-checkpoint" name="checkpoint" placeholder="unsloth/gemma-3-12b-it-GGUF:Q4_0" class="register-textbox" autocomplete="off">
|
|
217
|
+
<button type="button" id="select-folder-btn" class="folder-select-btn" title="Select local folder">📁</button>
|
|
218
|
+
</div>
|
|
219
|
+
<input type="file" id="folder-input" webkitdirectory directory style="display: none;">
|
|
211
220
|
</div>
|
|
212
221
|
<div class="register-form-row">
|
|
213
222
|
<label class="register-label">
|
|
@@ -262,6 +271,29 @@
|
|
|
262
271
|
<script src="https://cdn.jsdelivr.net/npm/marked@9.1.0/marked.min.js"></script>
|
|
263
272
|
<script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script>
|
|
264
273
|
|
|
274
|
+
<!-- Migration Cleanup Modal -->
|
|
275
|
+
<div id="migration-modal" class="modal" style="display:none;">
|
|
276
|
+
<div class="modal-content">
|
|
277
|
+
<div class="modal-header">
|
|
278
|
+
<h2>Clean Up Incompatible Models</h2>
|
|
279
|
+
<button class="modal-close" onclick="hideMigrationModal()">×</button>
|
|
280
|
+
</div>
|
|
281
|
+
<div class="modal-body">
|
|
282
|
+
<p>The following RyzenAI models are incompatible with RyzenAI 1.6 and can be safely deleted:</p>
|
|
283
|
+
<p class="migration-instructions">
|
|
284
|
+
After deleting, you can re-download compatible Ryzen AI 1.6 models from the <em>OGA NPU</em> and <em>OGA Hybrid</em> tabs.</p>
|
|
285
|
+
<div id="migration-model-list" class="migration-model-list"></div>
|
|
286
|
+
<div class="migration-summary">
|
|
287
|
+
<strong>Total space to free: <span id="migration-total-size"></span></strong>
|
|
288
|
+
</div>
|
|
289
|
+
</div>
|
|
290
|
+
<div class="modal-footer">
|
|
291
|
+
<button class="cancel-btn" onclick="hideMigrationModal()">Cancel</button>
|
|
292
|
+
<button class="delete-btn" onclick="deleteIncompatibleModels()">Delete All</button>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
</div>
|
|
296
|
+
|
|
265
297
|
<!-- Application JavaScript -->
|
|
266
298
|
<script src="/static/js/shared.js"></script>
|
|
267
299
|
<script src="/static/js/models.js"></script>
|
lemonade/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "8.
|
|
1
|
+
__version__ = "8.2.0"
|