lemonade-sdk 8.1.8__py3-none-any.whl → 8.1.10__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/cli.py +47 -1
- lemonade/common/inference_engines.py +13 -4
- lemonade/common/system_info.py +570 -1
- lemonade/profilers/agt_power.py +437 -0
- lemonade/profilers/hwinfo_power.py +429 -0
- lemonade/tools/llamacpp/utils.py +16 -4
- lemonade/tools/oga/load.py +15 -2
- lemonade/tools/server/llamacpp.py +3 -12
- lemonade/tools/server/serve.py +32 -0
- lemonade/tools/server/static/js/chat.js +481 -242
- lemonade/tools/server/static/js/models.js +106 -29
- lemonade/tools/server/static/js/shared.js +4 -2
- lemonade/tools/server/static/styles.css +114 -68
- lemonade/tools/server/static/webapp.html +19 -23
- lemonade/tools/server/tray.py +64 -0
- lemonade/version.py +1 -1
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/METADATA +2 -2
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/RECORD +26 -24
- lemonade_server/cli.py +2 -0
- lemonade_server/server_models.json +24 -6
- lemonade_server/settings.py +39 -39
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/WHEEL +0 -0
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/entry_points.txt +0 -0
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/licenses/LICENSE +0 -0
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/licenses/NOTICE.md +0 -0
- {lemonade_sdk-8.1.8.dist-info → lemonade_sdk-8.1.10.dist-info}/top_level.txt +0 -0
lemonade/tools/server/tray.py
CHANGED
|
@@ -7,9 +7,12 @@ import webbrowser
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
import logging
|
|
9
9
|
import tempfile
|
|
10
|
+
|
|
10
11
|
import requests
|
|
11
12
|
from packaging.version import parse as parse_version
|
|
12
13
|
|
|
14
|
+
from lemonade_server.pydantic_models import DEFAULT_CTX_SIZE
|
|
15
|
+
|
|
13
16
|
from lemonade.version import __version__
|
|
14
17
|
from lemonade.tools.server.utils.system_tray import SystemTray, Menu, MenuItem
|
|
15
18
|
|
|
@@ -57,6 +60,7 @@ class LemonadeTray(SystemTray):
|
|
|
57
60
|
self.executor = ThreadPoolExecutor(max_workers=1)
|
|
58
61
|
self.log_file = log_file
|
|
59
62
|
self.port = port
|
|
63
|
+
self.ctx_size = DEFAULT_CTX_SIZE
|
|
60
64
|
self.server_factory = server_factory
|
|
61
65
|
self.debug_logs_enabled = log_level == "debug"
|
|
62
66
|
|
|
@@ -282,6 +286,41 @@ class LemonadeTray(SystemTray):
|
|
|
282
286
|
self.logger.error(f"Error changing port: {str(e)}")
|
|
283
287
|
self.show_balloon_notification("Error", f"Failed to change port: {str(e)}")
|
|
284
288
|
|
|
289
|
+
def change_context_size(self, _, __, new_ctx_size):
|
|
290
|
+
"""
|
|
291
|
+
Change the server context size and restart the server.
|
|
292
|
+
"""
|
|
293
|
+
try:
|
|
294
|
+
# Stop the current server
|
|
295
|
+
if self.server_thread and self.server_thread.is_alive():
|
|
296
|
+
# Set should_exit flag on the uvicorn server instance
|
|
297
|
+
if (
|
|
298
|
+
hasattr(self.server, "uvicorn_server")
|
|
299
|
+
and self.server.uvicorn_server
|
|
300
|
+
):
|
|
301
|
+
self.server.uvicorn_server.should_exit = True
|
|
302
|
+
self.server_thread.join(timeout=2)
|
|
303
|
+
# Update the context size in both the tray and the server instance
|
|
304
|
+
self.ctx_size = new_ctx_size
|
|
305
|
+
if self.server:
|
|
306
|
+
self.server.ctx_size = new_ctx_size
|
|
307
|
+
# Restart the server
|
|
308
|
+
self.server_thread = threading.Thread(target=self.start_server, daemon=True)
|
|
309
|
+
self.server_thread.start()
|
|
310
|
+
# Show notification
|
|
311
|
+
ctx_size_label = (
|
|
312
|
+
f"{new_ctx_size//1024}K" if new_ctx_size >= 1024 else str(new_ctx_size)
|
|
313
|
+
)
|
|
314
|
+
self.show_balloon_notification(
|
|
315
|
+
"Context Size Changed",
|
|
316
|
+
f"Lemonade Server context size is now {ctx_size_label}",
|
|
317
|
+
)
|
|
318
|
+
except Exception as e: # pylint: disable=broad-exception-caught
|
|
319
|
+
self.logger.error(f"Error changing context size: {str(e)}")
|
|
320
|
+
self.show_balloon_notification(
|
|
321
|
+
"Error", f"Failed to change context size: {str(e)}"
|
|
322
|
+
)
|
|
323
|
+
|
|
285
324
|
def _using_installer(self):
|
|
286
325
|
"""
|
|
287
326
|
Check if the user is using the NSIS installer by checking for embeddable python
|
|
@@ -438,6 +477,30 @@ class LemonadeTray(SystemTray):
|
|
|
438
477
|
|
|
439
478
|
port_submenu = Menu(*port_menu_items)
|
|
440
479
|
|
|
480
|
+
# Create context size selection submenu with 6 options
|
|
481
|
+
ctx_size_menu_items = []
|
|
482
|
+
ctx_size_options = [
|
|
483
|
+
("4K", 4096),
|
|
484
|
+
("8K", 8192),
|
|
485
|
+
("16K", 16384),
|
|
486
|
+
("32K", 32768),
|
|
487
|
+
("64K", 65536),
|
|
488
|
+
("128K", 131072),
|
|
489
|
+
]
|
|
490
|
+
|
|
491
|
+
for ctx_label, ctx_value in ctx_size_options:
|
|
492
|
+
# Create a function that returns the lambda to properly capture the ctx_size variable
|
|
493
|
+
def create_ctx_handler(ctx_size):
|
|
494
|
+
return lambda icon, item: self.change_context_size(icon, item, ctx_size)
|
|
495
|
+
|
|
496
|
+
ctx_item = MenuItem(
|
|
497
|
+
f"Context size {ctx_label}", create_ctx_handler(ctx_value)
|
|
498
|
+
)
|
|
499
|
+
ctx_item.checked = ctx_value == self.ctx_size
|
|
500
|
+
ctx_size_menu_items.append(ctx_item)
|
|
501
|
+
|
|
502
|
+
ctx_size_submenu = Menu(*ctx_size_menu_items)
|
|
503
|
+
|
|
441
504
|
# Create the Logs submenu
|
|
442
505
|
debug_log_text = "Enable Debug Logs"
|
|
443
506
|
debug_log_item = MenuItem(debug_log_text, self.toggle_debug_logs)
|
|
@@ -452,6 +515,7 @@ class LemonadeTray(SystemTray):
|
|
|
452
515
|
if status_successfully_checked:
|
|
453
516
|
items.append(MenuItem("Load Model", None, submenu=load_submenu))
|
|
454
517
|
items.append(MenuItem("Port", None, submenu=port_submenu))
|
|
518
|
+
items.append(MenuItem("Context Size", None, submenu=ctx_size_submenu))
|
|
455
519
|
items.append(Menu.SEPARATOR)
|
|
456
520
|
|
|
457
521
|
# Only show upgrade option if newer version is available
|
lemonade/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "8.1.
|
|
1
|
+
__version__ = "8.1.10"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lemonade-sdk
|
|
3
|
-
Version: 8.1.
|
|
3
|
+
Version: 8.1.10
|
|
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
|
|
@@ -1,22 +1,24 @@
|
|
|
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=
|
|
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=
|
|
7
|
+
lemonade/version.py,sha256=BSj3P5N0EwzL0-jahgtLzMLFGfZHooaYa76BeUiW2wc,23
|
|
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
|
|
11
11
|
lemonade/common/exceptions.py,sha256=w83sVKmL1QXoJlGjj_bRyjIBMhlMqdVQy_FEOTu2YQI,2050
|
|
12
12
|
lemonade/common/filesystem.py,sha256=QV3cHhKNu-7W2rr8wZ4JQfD2rP_5T2Js7jiDQBYWHVQ,12142
|
|
13
|
-
lemonade/common/inference_engines.py,sha256=
|
|
13
|
+
lemonade/common/inference_engines.py,sha256=3bUGQe9wtfTiwt8kvI_ry077uyc9lid2G1fJX95kN1A,12969
|
|
14
14
|
lemonade/common/network.py,sha256=qXpUjDYQEYM_gH3JwTtU-pu_yCKcaa1IeohJRPy91-A,2903
|
|
15
15
|
lemonade/common/printing.py,sha256=GFFzrXIineIOMa9yu0lo5sL4j6A5BBg_T9aUCdP-juw,3229
|
|
16
16
|
lemonade/common/status.py,sha256=xSOZN508cdRtrs1HVyr9zmASYg69EsZBLSs0lroLoCM,16519
|
|
17
|
-
lemonade/common/system_info.py,sha256=
|
|
17
|
+
lemonade/common/system_info.py,sha256=Msa0pCSj3ZN3nerjY8wdqjjJLg6GPhbWf2htSNcFIHc,49607
|
|
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,42 +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=
|
|
39
|
+
lemonade/tools/llamacpp/utils.py,sha256=WEjdGmVxl30rt0a62MNo_X8ndFQ2SIrqtA2uF3klE6g,33090
|
|
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=
|
|
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
44
|
lemonade/tools/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
43
45
|
lemonade/tools/report/llm_report.py,sha256=bVHhwCINA-Ok2EdSwAsLubsc83N3KWOVuwTguw7jDcE,6676
|
|
44
46
|
lemonade/tools/report/table.py,sha256=Kv_Epd8a6KIrdzSC2EgIl6uTKw7E5eMq10Tg16O0WxM,27996
|
|
45
47
|
lemonade/tools/server/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
46
|
-
lemonade/tools/server/llamacpp.py,sha256=
|
|
47
|
-
lemonade/tools/server/serve.py,sha256=
|
|
48
|
+
lemonade/tools/server/llamacpp.py,sha256=8HdTkrU2ht8L1ldXqkfYfYhXiA8TvySuaslinAMqr-c,9002
|
|
49
|
+
lemonade/tools/server/serve.py,sha256=W6wugCEaRNsDpWKIcsACrKZRFEwt7H1qWr6kG07WCek,62739
|
|
48
50
|
lemonade/tools/server/tool_calls.py,sha256=xrAlQwKG-nv2xLlf8f9CDSaUbyMn8ZtHkds9iZLG9K8,5230
|
|
49
|
-
lemonade/tools/server/tray.py,sha256=
|
|
51
|
+
lemonade/tools/server/tray.py,sha256=2PQxoEWH-zzUGlveTW4heij4UC9SzxXcFlGs0JtFjF0,22226
|
|
50
52
|
lemonade/tools/server/webapp.py,sha256=8Das5yXOaSBLZmSZ_eddJajQFxBhvl5D6GI_hHlGbE0,1040
|
|
51
53
|
lemonade/tools/server/wrapped_server.py,sha256=DlzsGUwLQzjOFRfTTxfnhvmM_9lvAki96jWIAz7Czds,16713
|
|
52
54
|
lemonade/tools/server/static/favicon.ico,sha256=hMmP9qGJNeZ0mFS86JIqPbZstXMZn0Z76_HfHQpREAU,126745
|
|
53
|
-
lemonade/tools/server/static/styles.css,sha256=
|
|
54
|
-
lemonade/tools/server/static/webapp.html,sha256=
|
|
55
|
-
lemonade/tools/server/static/js/chat.js,sha256=
|
|
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
|
|
56
58
|
lemonade/tools/server/static/js/model-settings.js,sha256=JXHeG7xVrRU181Hj7CZflERAi1Z6t-qwYFR4aH5nf5I,5820
|
|
57
|
-
lemonade/tools/server/static/js/models.js,sha256=
|
|
58
|
-
lemonade/tools/server/static/js/shared.js,sha256=
|
|
59
|
+
lemonade/tools/server/static/js/models.js,sha256=7bCJbvS8FWpj6f1ZOwM8pt6UOQueuiOGLG79qrs-C-A,35872
|
|
60
|
+
lemonade/tools/server/static/js/shared.js,sha256=mD03xqyMH1iQwH4pOq4IpDDaAX0z7YZY71gD8gufRAg,17487
|
|
59
61
|
lemonade/tools/server/utils/port.py,sha256=J7-g-Aqygb50jNoHLhhRfBZVM-uhGlcB5-oYBAehvgw,2263
|
|
60
62
|
lemonade/tools/server/utils/system_tray.py,sha256=b9lvNv9chJKQxvmH7qzAuUe6H9HsLu7pdHFqGlAJaL0,12654
|
|
61
63
|
lemonade/tools/server/utils/thread.py,sha256=Z-PDzGcpgfN2qxTmtlROWqrUN0B2fXdPrqo_J10fR_w,2772
|
|
62
64
|
lemonade_install/__init__.py,sha256=26zohKg2jgr_5y7tObduWMYQg8zCTWMZHL8lfi2zZVQ,40
|
|
63
65
|
lemonade_install/install.py,sha256=Dow7kt-K9WI4PH15hBwkKtOxede3dAaOmH4I1y_P5H4,27008
|
|
64
|
-
lemonade_sdk-8.1.
|
|
65
|
-
lemonade_sdk-8.1.
|
|
66
|
-
lemonade_server/cli.py,sha256=
|
|
66
|
+
lemonade_sdk-8.1.10.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
67
|
+
lemonade_sdk-8.1.10.dist-info/licenses/NOTICE.md,sha256=RSca9LE5e6pvdWA_LXAUCcACIHPmINKqkRX-AVRqBGo,3499
|
|
68
|
+
lemonade_server/cli.py,sha256=0Ht82D1z4Z2MuxTc07jF2glaegX4jT3Jh--sS6ZO6Qc,19302
|
|
67
69
|
lemonade_server/model_manager.py,sha256=V8QRf1nlh3wAFtUHoSF_JeAXeR7sfaZE1uTfppcIfcw,20492
|
|
68
70
|
lemonade_server/pydantic_models.py,sha256=49MyOlb5feLUlKsGcI75tWaflWckrItqcSVkdCY4e3A,3269
|
|
69
|
-
lemonade_server/server_models.json,sha256=
|
|
70
|
-
lemonade_server/settings.py,sha256=
|
|
71
|
-
lemonade_sdk-8.1.
|
|
72
|
-
lemonade_sdk-8.1.
|
|
73
|
-
lemonade_sdk-8.1.
|
|
74
|
-
lemonade_sdk-8.1.
|
|
75
|
-
lemonade_sdk-8.1.
|
|
71
|
+
lemonade_server/server_models.json,sha256=0H_G6Jw6Yuz6t0RZnFnq0SbBCsw_cQLe9j24TkyF2eI,12344
|
|
72
|
+
lemonade_server/settings.py,sha256=JOlZmirUXO9rA6BCODVFwyXrrHtYoH_LiKYm49lGm_c,1260
|
|
73
|
+
lemonade_sdk-8.1.10.dist-info/METADATA,sha256=EYovzTHGnvWEZI-v_Gg1X0ajXeXiQPydqOkisnh08ME,15023
|
|
74
|
+
lemonade_sdk-8.1.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
75
|
+
lemonade_sdk-8.1.10.dist-info/entry_points.txt,sha256=7sRvpNhi1E7amnM7RZo57e8yFF9iA5uuRaIeJ1Xre6w,193
|
|
76
|
+
lemonade_sdk-8.1.10.dist-info/top_level.txt,sha256=10ap5GNiPhalO4V50LRoxA1FqRT9g3Xkia6BITu880k,42
|
|
77
|
+
lemonade_sdk-8.1.10.dist-info/RECORD,,
|
lemonade_server/cli.py
CHANGED
|
@@ -375,9 +375,11 @@ def is_lemonade_server(pid):
|
|
|
375
375
|
if process_name in [ # Windows
|
|
376
376
|
"lemonade-server-dev.exe",
|
|
377
377
|
"lemonade-server.exe",
|
|
378
|
+
"lsdev.exe",
|
|
378
379
|
] or process_name in [ # Linux
|
|
379
380
|
"lemonade-server-dev",
|
|
380
381
|
"lemonade-server",
|
|
382
|
+
"lsdev",
|
|
381
383
|
]:
|
|
382
384
|
return True
|
|
383
385
|
elif "llama-server" in process_name:
|
|
@@ -225,6 +225,12 @@
|
|
|
225
225
|
"suggested": true,
|
|
226
226
|
"labels": ["reasoning"]
|
|
227
227
|
},
|
|
228
|
+
"Qwen3-4B-Instruct-2507-GGUF": {
|
|
229
|
+
"checkpoint": "unsloth/Qwen3-4B-Instruct-2507-GGUF:Qwen3-4B-Instruct-2507-Q4_K_M.gguf",
|
|
230
|
+
"recipe": "llamacpp",
|
|
231
|
+
"suggested": true,
|
|
232
|
+
"labels": ["hot"]
|
|
233
|
+
},
|
|
228
234
|
"Qwen3-30B-A3B-GGUF": {
|
|
229
235
|
"checkpoint": "unsloth/Qwen3-30B-A3B-GGUF:Q4_0",
|
|
230
236
|
"recipe": "llamacpp",
|
|
@@ -241,14 +247,14 @@
|
|
|
241
247
|
"checkpoint": "unsloth/Qwen3-Coder-30B-A3B-Instruct-GGUF:Qwen3-Coder-30B-A3B-Instruct-Q4_K_M.gguf",
|
|
242
248
|
"recipe": "llamacpp",
|
|
243
249
|
"suggested": true,
|
|
244
|
-
"labels": ["coding","
|
|
250
|
+
"labels": ["coding","tool-calling"]
|
|
245
251
|
},
|
|
246
252
|
"Gemma-3-4b-it-GGUF": {
|
|
247
253
|
"checkpoint": "ggml-org/gemma-3-4b-it-GGUF:Q4_K_M",
|
|
248
254
|
"mmproj": "mmproj-model-f16.gguf",
|
|
249
255
|
"recipe": "llamacpp",
|
|
250
256
|
"suggested": true,
|
|
251
|
-
"labels": ["vision"]
|
|
257
|
+
"labels": ["hot","vision"]
|
|
252
258
|
},
|
|
253
259
|
"Qwen2.5-VL-7B-Instruct-GGUF": {
|
|
254
260
|
"checkpoint": "ggml-org/Qwen2.5-VL-7B-Instruct-GGUF:Q4_K_M",
|
|
@@ -299,7 +305,7 @@
|
|
|
299
305
|
"checkpoint": "mistralai/Devstral-Small-2507_gguf:Q4_K_M",
|
|
300
306
|
"recipe": "llamacpp",
|
|
301
307
|
"suggested": true,
|
|
302
|
-
"labels": ["coding"]
|
|
308
|
+
"labels": ["coding","tool-calling"]
|
|
303
309
|
},
|
|
304
310
|
"Qwen2.5-Coder-32B-Instruct-GGUF": {
|
|
305
311
|
"checkpoint": "Qwen/Qwen2.5-Coder-32B-Instruct-GGUF:Q4_K_M",
|
|
@@ -310,14 +316,26 @@
|
|
|
310
316
|
"gpt-oss-120b-GGUF": {
|
|
311
317
|
"checkpoint": "unsloth/gpt-oss-120b-GGUF:Q4_K_M",
|
|
312
318
|
"recipe": "llamacpp",
|
|
313
|
-
"suggested":
|
|
314
|
-
"labels": ["
|
|
319
|
+
"suggested": false,
|
|
320
|
+
"labels": ["reasoning", "tool-calling"]
|
|
315
321
|
},
|
|
316
322
|
"gpt-oss-20b-GGUF": {
|
|
317
323
|
"checkpoint": "unsloth/gpt-oss-20b-GGUF:Q4_K_M",
|
|
318
324
|
"recipe": "llamacpp",
|
|
325
|
+
"suggested": false,
|
|
326
|
+
"labels": ["reasoning", "tool-calling"]
|
|
327
|
+
},
|
|
328
|
+
"gpt-oss-120b-mxfp-GGUF": {
|
|
329
|
+
"checkpoint": "ggml-org/gpt-oss-120b-GGUF:*",
|
|
330
|
+
"recipe": "llamacpp",
|
|
331
|
+
"suggested": true,
|
|
332
|
+
"labels": ["hot", "reasoning", "tool-calling"]
|
|
333
|
+
},
|
|
334
|
+
"gpt-oss-20b-mxfp4-GGUF": {
|
|
335
|
+
"checkpoint": "ggml-org/gpt-oss-20b-GGUF",
|
|
336
|
+
"recipe": "llamacpp",
|
|
319
337
|
"suggested": true,
|
|
320
|
-
"labels": ["hot", "reasoning"]
|
|
338
|
+
"labels": ["hot", "reasoning", "tool-calling"]
|
|
321
339
|
},
|
|
322
340
|
"GLM-4.5-Air-UD-Q4K-XL-GGUF": {
|
|
323
341
|
"checkpoint": "unsloth/GLM-4.5-Air-GGUF:UD-Q4_K_XL",
|
lemonade_server/settings.py
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import os
|
|
3
|
-
from lemonade.cache import DEFAULT_CACHE_DIR
|
|
4
|
-
|
|
5
|
-
# Define the path for the user settings file, placing it in the cache directory
|
|
6
|
-
USER_SETTINGS_FILE = os.path.join(DEFAULT_CACHE_DIR, "user_settings.json")
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def save_setting(key, value):
|
|
10
|
-
"""Save a setting to the user_settings.json file."""
|
|
11
|
-
# Ensure the cache directory exists
|
|
12
|
-
os.makedirs(DEFAULT_CACHE_DIR, exist_ok=True)
|
|
13
|
-
|
|
14
|
-
settings = {}
|
|
15
|
-
if os.path.exists(USER_SETTINGS_FILE):
|
|
16
|
-
with open(USER_SETTINGS_FILE, "r") as f:
|
|
17
|
-
try:
|
|
18
|
-
settings = json.load(f)
|
|
19
|
-
except json.JSONDecodeError:
|
|
20
|
-
# If the file is empty or corrupt, start with a fresh dictionary
|
|
21
|
-
pass
|
|
22
|
-
|
|
23
|
-
settings[key] = value
|
|
24
|
-
with open(USER_SETTINGS_FILE, "w") as f:
|
|
25
|
-
json.dump(settings, f, indent=4)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def load_setting(key, default=None):
|
|
29
|
-
"""Load a setting from the user_settings.json file."""
|
|
30
|
-
if not os.path.exists(USER_SETTINGS_FILE):
|
|
31
|
-
return default
|
|
32
|
-
|
|
33
|
-
with open(USER_SETTINGS_FILE, "r") as f:
|
|
34
|
-
try:
|
|
35
|
-
settings = json.load(f)
|
|
36
|
-
return settings.get(key, default)
|
|
37
|
-
except json.JSONDecodeError:
|
|
38
|
-
# Return default if the file is empty or corrupt
|
|
39
|
-
return default
|
|
1
|
+
import json
|
|
2
|
+
import os
|
|
3
|
+
from lemonade.cache import DEFAULT_CACHE_DIR
|
|
4
|
+
|
|
5
|
+
# Define the path for the user settings file, placing it in the cache directory
|
|
6
|
+
USER_SETTINGS_FILE = os.path.join(DEFAULT_CACHE_DIR, "user_settings.json")
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def save_setting(key, value):
|
|
10
|
+
"""Save a setting to the user_settings.json file."""
|
|
11
|
+
# Ensure the cache directory exists
|
|
12
|
+
os.makedirs(DEFAULT_CACHE_DIR, exist_ok=True)
|
|
13
|
+
|
|
14
|
+
settings = {}
|
|
15
|
+
if os.path.exists(USER_SETTINGS_FILE):
|
|
16
|
+
with open(USER_SETTINGS_FILE, "r") as f:
|
|
17
|
+
try:
|
|
18
|
+
settings = json.load(f)
|
|
19
|
+
except json.JSONDecodeError:
|
|
20
|
+
# If the file is empty or corrupt, start with a fresh dictionary
|
|
21
|
+
pass
|
|
22
|
+
|
|
23
|
+
settings[key] = value
|
|
24
|
+
with open(USER_SETTINGS_FILE, "w") as f:
|
|
25
|
+
json.dump(settings, f, indent=4)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def load_setting(key, default=None):
|
|
29
|
+
"""Load a setting from the user_settings.json file."""
|
|
30
|
+
if not os.path.exists(USER_SETTINGS_FILE):
|
|
31
|
+
return default
|
|
32
|
+
|
|
33
|
+
with open(USER_SETTINGS_FILE, "r") as f:
|
|
34
|
+
try:
|
|
35
|
+
settings = json.load(f)
|
|
36
|
+
return settings.get(key, default)
|
|
37
|
+
except json.JSONDecodeError:
|
|
38
|
+
# Return default if the file is empty or corrupt
|
|
39
|
+
return default
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|