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.

@@ -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.8"
1
+ __version__ = "8.1.10"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lemonade-sdk
3
- Version: 8.1.8
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=2dWGg3u_iCS4zVfLImYhPEOBcw1_JqY2doCaQL6hYpM,4237
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=KEEcawgJAxFWpeDw-nZyFzFwfyl_0inM8UDk3-FNKWE,22
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=pJxn0zOf3gEmjGAIWXNdCibfzarzc7LRbZjoQyygkcU,12591
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=pn-k3zMQCbt5cu3aHXa4cENgrubOK97gs9PYdGPsFXA,28405
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=96POJXoIBE_zLArusiOrgyCcz8D5vR3IuXkMzyg79CU,32608
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=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
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=a_rO4ElrUbxlMeNx-8Ru6QQvgFhylotE-4-76bVAdr4,9358
47
- lemonade/tools/server/serve.py,sha256=gwKPs-r-bfQsyCkVxzVyTp0SyNYVqqfMeeUFQ9TivwM,61638
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=a9z6hdqlfj91H00j6hAExRPQkzWHhE3dnqSumzEgq0U,19599
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=TivveWAEyWnEXGJX_j22432LLWdwMljpW_70WuwIVsk,43730
54
- lemonade/tools/server/static/webapp.html,sha256=KbYl8_q0GOXHiZTAv96O1e2RujfWMy6DLA4Wc5IbomY,18173
55
- lemonade/tools/server/static/js/chat.js,sha256=vTfwJODpxkNPGG3J0AhfIF1WbraWnHNmbCQOsS-Fyc4,29488
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=2ueyUfn7f4UeAvha9vyDCEi3fDk0BxLlut1N0L2f2EE,32862
58
- lemonade/tools/server/static/js/shared.js,sha256=56dcVnAPiM7hKQwDVszlXCufCgzGiZyfNec9B-ScsHo,17356
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.8.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
65
- lemonade_sdk-8.1.8.dist-info/licenses/NOTICE.md,sha256=RSca9LE5e6pvdWA_LXAUCcACIHPmINKqkRX-AVRqBGo,3499
66
- lemonade_server/cli.py,sha256=IsyWGDIeiN0MnIaBryLhArHhPj1HD52l6028dNHQCKc,19248
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=DAdG4ebIt5Dy5MM3kmXn1pO0XbNMph1gdpzbacBDVuc,11664
70
- lemonade_server/settings.py,sha256=6nsmPLFJD-UokQDmlx9ZBYMbpnn48So_PuBGWP7Fmfg,1299
71
- lemonade_sdk-8.1.8.dist-info/METADATA,sha256=EoGUK5KNOw1lCefStfN47N-3mUIdJeNGTtpDIE63i0E,14992
72
- lemonade_sdk-8.1.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
73
- lemonade_sdk-8.1.8.dist-info/entry_points.txt,sha256=7sRvpNhi1E7amnM7RZo57e8yFF9iA5uuRaIeJ1Xre6w,193
74
- lemonade_sdk-8.1.8.dist-info/top_level.txt,sha256=10ap5GNiPhalO4V50LRoxA1FqRT9g3Xkia6BITu880k,42
75
- lemonade_sdk-8.1.8.dist-info/RECORD,,
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","hot"]
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": true,
314
- "labels": ["hot", "reasoning"]
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",
@@ -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