llms-py 2.0.30__py3-none-any.whl → 2.0.31__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.
llms/main.py CHANGED
@@ -1,5 +1,8 @@
1
1
  #!/usr/bin/env python
2
2
 
3
+ # Copyright (c) Demis Bellot, ServiceStack <https://servicestack.net>
4
+ # License: https://github.com/ServiceStack/llms/blob/main/LICENSE
5
+
3
6
  # A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers.
4
7
  # Docs: https://github.com/ServiceStack/llms
5
8
 
@@ -31,7 +34,7 @@ try:
31
34
  except ImportError:
32
35
  HAS_PIL = False
33
36
 
34
- VERSION = "2.0.30"
37
+ VERSION = "2.0.31"
35
38
  _ROOT = None
36
39
  g_config_path = None
37
40
  g_ui_path = None
@@ -519,6 +522,8 @@ class OpenAiProvider:
519
522
  chat = await process_chat(chat)
520
523
  _log(f"POST {self.chat_url}")
521
524
  _log(chat_summary(chat))
525
+ # remove metadata if any (conflicts with some providers, e.g. Z.ai)
526
+ chat.pop('metadata', None)
522
527
 
523
528
  async with aiohttp.ClientSession() as session:
524
529
  started_at = time.time()
llms/ui/App.mjs CHANGED
@@ -50,7 +50,7 @@ export default {
50
50
  <div
51
51
  v-if="isMobile && ai.isSidebarOpen && !(ai.requiresAuth && !ai.auth)"
52
52
  @click="closeSidebar"
53
- class="fixed inset-0 bg-black bg-opacity-50 z-40 lg:hidden"
53
+ class="fixed inset-0 bg-black/50 z-40 lg:hidden"
54
54
  ></div>
55
55
 
56
56
  <!-- Sidebar (hidden when auth required and not authenticated) -->
llms/ui/ai.mjs CHANGED
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '2.0.30',
9
+ version: '2.0.31',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
llms/ui/app.css CHANGED
@@ -350,12 +350,6 @@
350
350
  .top-4 {
351
351
  top: calc(var(--spacing) * 4);
352
352
  }
353
- .top-12 {
354
- top: calc(var(--spacing) * 12);
355
- }
356
- .top-16 {
357
- top: calc(var(--spacing) * 16);
358
- }
359
353
  .right-0 {
360
354
  right: calc(var(--spacing) * 0);
361
355
  }
@@ -368,9 +362,6 @@
368
362
  .left-0 {
369
363
  left: calc(var(--spacing) * 0);
370
364
  }
371
- .left-4 {
372
- left: calc(var(--spacing) * 4);
373
- }
374
365
  .left-full {
375
366
  left: 100%;
376
367
  }
@@ -383,9 +374,6 @@
383
374
  .z-20 {
384
375
  z-index: 20;
385
376
  }
386
- .z-30 {
387
- z-index: 30;
388
- }
389
377
  .z-40 {
390
378
  z-index: 40;
391
379
  }
@@ -419,15 +407,9 @@
419
407
  max-width: 96rem;
420
408
  }
421
409
  }
422
- .-m-2 {
423
- margin: calc(var(--spacing) * -2);
424
- }
425
410
  .-m-2\.5 {
426
411
  margin: calc(var(--spacing) * -2.5);
427
412
  }
428
- .-mx-1 {
429
- margin-inline: calc(var(--spacing) * -1);
430
- }
431
413
  .-mx-1\.5 {
432
414
  margin-inline: calc(var(--spacing) * -1.5);
433
415
  }
@@ -440,9 +422,6 @@
440
422
  .mx-auto {
441
423
  margin-inline: auto;
442
424
  }
443
- .-my-1 {
444
- margin-block: calc(var(--spacing) * -1);
445
- }
446
425
  .-my-1\.5 {
447
426
  margin-block: calc(var(--spacing) * -1.5);
448
427
  }
@@ -518,9 +497,6 @@
518
497
  .-ml-px {
519
498
  margin-left: -1px;
520
499
  }
521
- .ml-0 {
522
- margin-left: calc(var(--spacing) * 0);
523
- }
524
500
  .ml-0\.5 {
525
501
  margin-left: calc(var(--spacing) * 0.5);
526
502
  }
@@ -754,9 +730,6 @@
754
730
  .min-w-0 {
755
731
  min-width: calc(var(--spacing) * 0);
756
732
  }
757
- .min-w-2 {
758
- min-width: calc(var(--spacing) * 2);
759
- }
760
733
  .min-w-6 {
761
734
  min-width: calc(var(--spacing) * 6);
762
735
  }
@@ -923,13 +896,6 @@
923
896
  margin-block-end: calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)));
924
897
  }
925
898
  }
926
- .space-y-2 {
927
- :where(& > :not(:last-child)) {
928
- --tw-space-y-reverse: 0;
929
- margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));
930
- margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)));
931
- }
932
- }
933
899
  .space-y-4 {
934
900
  :where(& > :not(:last-child)) {
935
901
  --tw-space-y-reverse: 0;
@@ -1151,9 +1117,6 @@
1151
1117
  .border-yellow-400 {
1152
1118
  border-color: var(--color-yellow-400);
1153
1119
  }
1154
- .bg-black {
1155
- background-color: var(--color-black);
1156
- }
1157
1120
  .bg-black\/40 {
1158
1121
  background-color: color-mix(in srgb, #000 40%, transparent);
1159
1122
  @supports (color: color-mix(in lab, red, red)) {
@@ -1194,9 +1157,6 @@
1194
1157
  .bg-gray-400 {
1195
1158
  background-color: var(--color-gray-400);
1196
1159
  }
1197
- .bg-gray-500 {
1198
- background-color: var(--color-gray-500);
1199
- }
1200
1160
  .bg-gray-500\/75 {
1201
1161
  background-color: color-mix(in srgb, oklch(55.1% 0.027 264.364) 75%, transparent);
1202
1162
  @supports (color: color-mix(in lab, red, red)) {
@@ -1211,9 +1171,6 @@
1211
1171
  .bg-gray-700 {
1212
1172
  background-color: var(--color-gray-700);
1213
1173
  }
1214
- .bg-gray-900 {
1215
- background-color: var(--color-gray-900);
1216
- }
1217
1174
  .bg-gray-900\/80 {
1218
1175
  background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 80%, transparent);
1219
1176
  @supports (color: color-mix(in lab, red, red)) {
@@ -1264,9 +1221,6 @@
1264
1221
  .bg-sky-600 {
1265
1222
  background-color: var(--color-sky-600);
1266
1223
  }
1267
- .bg-slate-400 {
1268
- background-color: var(--color-slate-400);
1269
- }
1270
1224
  .bg-slate-400\/10 {
1271
1225
  background-color: color-mix(in srgb, oklch(70.4% 0.04 256.788) 10%, transparent);
1272
1226
  @supports (color: color-mix(in lab, red, red)) {
@@ -1305,9 +1259,6 @@
1305
1259
  .p-2\.5 {
1306
1260
  padding: calc(var(--spacing) * 2.5);
1307
1261
  }
1308
- .p-3 {
1309
- padding: calc(var(--spacing) * 3);
1310
- }
1311
1262
  .p-4 {
1312
1263
  padding: calc(var(--spacing) * 4);
1313
1264
  }
@@ -1332,9 +1283,6 @@
1332
1283
  .px-6 {
1333
1284
  padding-inline: calc(var(--spacing) * 6);
1334
1285
  }
1335
- .py-0 {
1336
- padding-block: calc(var(--spacing) * 0);
1337
- }
1338
1286
  .py-0\.5 {
1339
1287
  padding-block: calc(var(--spacing) * 0.5);
1340
1288
  }
@@ -1365,9 +1313,6 @@
1365
1313
  .py-12 {
1366
1314
  padding-block: calc(var(--spacing) * 12);
1367
1315
  }
1368
- .pt-0 {
1369
- padding-top: calc(var(--spacing) * 0);
1370
- }
1371
1316
  .pt-0\.5 {
1372
1317
  padding-top: calc(var(--spacing) * 0.5);
1373
1318
  }
@@ -1689,9 +1634,6 @@
1689
1634
  .uppercase {
1690
1635
  text-transform: uppercase;
1691
1636
  }
1692
- .underline {
1693
- text-decoration-line: underline;
1694
- }
1695
1637
  .placeholder-gray-500 {
1696
1638
  &::placeholder {
1697
1639
  color: var(--color-gray-500);
@@ -1753,9 +1695,6 @@
1753
1695
  --tw-inset-ring-shadow: inset 0 0 0 1px var(--tw-inset-ring-color, currentcolor);
1754
1696
  box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
1755
1697
  }
1756
- .ring-black {
1757
- --tw-ring-color: var(--color-black);
1758
- }
1759
1698
  .ring-black\/5 {
1760
1699
  --tw-ring-color: color-mix(in srgb, #000 5%, transparent);
1761
1700
  @supports (color: color-mix(in lab, red, red)) {
@@ -1770,9 +1709,6 @@
1770
1709
  .ring-indigo-500 {
1771
1710
  --tw-ring-color: var(--color-indigo-500);
1772
1711
  }
1773
- .inset-ring-gray-900 {
1774
- --tw-inset-ring-color: var(--color-gray-900);
1775
- }
1776
1712
  .inset-ring-gray-900\/5 {
1777
1713
  --tw-inset-ring-color: color-mix(in srgb, oklch(21% 0.034 264.665) 5%, transparent);
1778
1714
  @supports (color: color-mix(in lab, red, red)) {
@@ -1903,13 +1839,6 @@
1903
1839
  }
1904
1840
  }
1905
1841
  }
1906
- .group-hover\:opacity-0 {
1907
- &:is(:where(.group):hover *) {
1908
- @media (hover: hover) {
1909
- opacity: 0%;
1910
- }
1911
- }
1912
- }
1913
1842
  .group-hover\:opacity-100 {
1914
1843
  &:is(:where(.group):hover *) {
1915
1844
  @media (hover: hover) {
@@ -2788,11 +2717,6 @@
2788
2717
  flex-direction: row-reverse;
2789
2718
  }
2790
2719
  }
2791
- .sm\:flex-wrap {
2792
- @media (width >= 40rem) {
2793
- flex-wrap: wrap;
2794
- }
2795
- }
2796
2720
  .sm\:items-center {
2797
2721
  @media (width >= 40rem) {
2798
2722
  align-items: center;
@@ -2892,21 +2816,11 @@
2892
2816
  transition-duration: 700ms;
2893
2817
  }
2894
2818
  }
2895
- .md\:relative {
2896
- @media (width >= 48rem) {
2897
- position: relative;
2898
- }
2899
- }
2900
2819
  .md\:flex {
2901
2820
  @media (width >= 48rem) {
2902
2821
  display: flex;
2903
2822
  }
2904
2823
  }
2905
- .md\:hidden {
2906
- @media (width >= 48rem) {
2907
- display: none;
2908
- }
2909
- }
2910
2824
  .md\:inline {
2911
2825
  @media (width >= 48rem) {
2912
2826
  display: inline;
@@ -2922,12 +2836,6 @@
2922
2836
  max-width: var(--container-xl);
2923
2837
  }
2924
2838
  }
2925
- .md\:translate-x-0 {
2926
- @media (width >= 48rem) {
2927
- --tw-translate-x: calc(var(--spacing) * 0);
2928
- translate: var(--tw-translate-x) var(--tw-translate-y);
2929
- }
2930
- }
2931
2839
  .md\:grid-cols-2 {
2932
2840
  @media (width >= 48rem) {
2933
2841
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -2938,11 +2846,6 @@
2938
2846
  grid-template-columns: repeat(4, minmax(0, 1fr));
2939
2847
  }
2940
2848
  }
2941
- .md\:grid-cols-5 {
2942
- @media (width >= 48rem) {
2943
- grid-template-columns: repeat(5, minmax(0, 1fr));
2944
- }
2945
- }
2946
2849
  .md\:rounded-lg {
2947
2850
  @media (width >= 48rem) {
2948
2851
  border-radius: var(--radius-lg);
@@ -2983,11 +2886,6 @@
2983
2886
  display: none;
2984
2887
  }
2985
2888
  }
2986
- .lg\:inline {
2987
- @media (width >= 64rem) {
2988
- display: inline;
2989
- }
2990
- }
2991
2889
  .lg\:table-cell {
2992
2890
  @media (width >= 64rem) {
2993
2891
  display: table-cell;
@@ -2998,11 +2896,6 @@
2998
2896
  width: calc(var(--spacing) * 72);
2999
2897
  }
3000
2898
  }
3001
- .lg\:w-84 {
3002
- @media (width >= 64rem) {
3003
- width: calc(var(--spacing) * 84);
3004
- }
3005
- }
3006
2899
  .lg\:w-auto {
3007
2900
  @media (width >= 64rem) {
3008
2901
  width: auto;
@@ -3018,12 +2911,6 @@
3018
2911
  flex: 0 auto;
3019
2912
  }
3020
2913
  }
3021
- .lg\:translate-x-0 {
3022
- @media (width >= 64rem) {
3023
- --tw-translate-x: calc(var(--spacing) * 0);
3024
- translate: var(--tw-translate-x) var(--tw-translate-y);
3025
- }
3026
- }
3027
2914
  .lg\:grid-cols-2 {
3028
2915
  @media (width >= 64rem) {
3029
2916
  grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -3084,11 +2971,6 @@
3084
2971
  max-width: var(--container-3xl);
3085
2972
  }
3086
2973
  }
3087
- .xl\:max-w-68 {
3088
- @media (width >= 80rem) {
3089
- max-width: calc(var(--spacing) * 68);
3090
- }
3091
- }
3092
2974
  .xl\:max-w-72 {
3093
2975
  @media (width >= 80rem) {
3094
2976
  max-width: calc(var(--spacing) * 72);
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 2.0.30
3
+ Version: 2.0.31
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -108,6 +108,26 @@ As they're a good indicator for the reliability and speed you can expect from di
108
108
  test the response times for all configured providers and models, the results of which will be frequently published to
109
109
  [/checks/latest.txt](https://github.com/ServiceStack/llms/blob/main/docs/checks/latest.txt)
110
110
 
111
+ ## Change Log
112
+
113
+ #### v2.0.30 (2025-11-01)
114
+ - Improved Responsive Layout with collapsible Sidebar
115
+ - Watching config files for changes and auto-reloading
116
+ - Add cancel button to cancel pending request
117
+ - Return focus to textarea after request completes
118
+ - Clicking outside model or system prompt selector will collapse it
119
+ - Clicking on selected item no longer deselects it
120
+ - Support `VERBOSE=1` for enabling `--verbose` mode (useful in Docker)
121
+
122
+ #### v2.0.28 (2025-10-31)
123
+ - Dark Mode
124
+ - Drag n' Drop files in Message prompt
125
+ - Copy & Paste files in Message prompt
126
+ - Support for GitHub OAuth and optional restrict access to specified Users
127
+ - Support for Docker and Docker Compose
128
+
129
+ [llms.py Releases](https://github.com/ServiceStack/llms/releases)
130
+
111
131
  ## Installation
112
132
 
113
133
  ### Using pip
@@ -1,11 +1,11 @@
1
1
  llms/__init__.py,sha256=Mk6eHi13yoUxLlzhwfZ6A1IjsfSQt9ShhOdbLXTvffU,53
2
2
  llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
3
  llms/index.html,sha256=_pkjdzCX95HTf19LgE4gMh6tLittcnf7M_jL2hSEbbM,3250
4
- llms/llms.json,sha256=oTMlVM3nYeooQgsPbIGN2LQ-1aq0u1v38sjmxHPiGAc,41331
5
- llms/main.py,sha256=TIJZL21UCZfyRMh_HPdsFi2ahpIFgs6o4KkRSkxTwqc,90617
4
+ llms/llms.json,sha256=4y4BbQcwul4HdUU9LfZOJWyUjTt0nFzGkT_Mlyd7dVU,31945
5
+ llms/main.py,sha256=6a1xJVL5eS8V0Ndns4o771CYxFfjj8JPByUnT8s60qg,90865
6
6
  llms/ui.json,sha256=iBOmpNeD5-o8AgUa51ymS-KemovJ7bm9J1fnL0nf8jk,134025
7
7
  llms/ui/Analytics.mjs,sha256=LfWbUlpb__0EEYtHu6e4r8AeyhsNQeAxrg44RuNSR0M,73261
8
- llms/ui/App.mjs,sha256=S-yomlT-6UMB9R5dx-W6EEO4pcE3ldV5e9mr1Kk_Lyw,3822
8
+ llms/ui/App.mjs,sha256=L8Zn7b7YVqR5jgVQKvo_txijSd1T7jq6QOQEt7Q0eB0,3811
9
9
  llms/ui/Avatar.mjs,sha256=TgouwV9bN-Ou1Tf2zCDtVaRiUB21TXZZPFCTlFL-xxQ,3387
10
10
  llms/ui/Brand.mjs,sha256=JLN_lPirNXqS332g0B_WVOlFRVg3lNe1Q56TRnpj0zQ,3411
11
11
  llms/ui/ChatPrompt.mjs,sha256=7Bx2-ossJPm8F2n9M82vNt8J-ayHEXft3qctd9TeSdw,27147
@@ -21,8 +21,8 @@ llms/ui/SignIn.mjs,sha256=df3b-7L3ZIneDGbJWUk93K9RGo40gVeuR5StzT1ZH9g,2324
21
21
  llms/ui/SystemPromptEditor.mjs,sha256=PffkNPV6hGbm1QZBKPI7yvWPZSBL7qla0d-JEJ4mxYo,1466
22
22
  llms/ui/SystemPromptSelector.mjs,sha256=UgoeuscFes0B1oFkx74dFwC0JgRib37VM4Gy3-kCVDQ,3769
23
23
  llms/ui/Welcome.mjs,sha256=r9j7unF9CF3k7gEQBMRMVsa2oSjgHGNn46Oa5l5BwlY,950
24
- llms/ui/ai.mjs,sha256=Mrhsr-Y9VRWRZ9oSMu4z6u6nxll-xlRz0Cj1R9jv72A,4849
25
- llms/ui/app.css,sha256=B0GMDo-hRJ5ufV4d1qYRpIX3LSnBfBZMHeqrDcC1z8A,113515
24
+ llms/ui/ai.mjs,sha256=KYxbKkcdyJZuaSfzgAPqsC81CiviAtbXZwyzmKYoIk4,4849
25
+ llms/ui/app.css,sha256=m6wR6XCzJWbUs0K_MDyGbcnxsWOu2Q58nGpAL646kio,111026
26
26
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
27
27
  llms/ui/markdown.mjs,sha256=uWSyBZZ8a76Dkt53q6CJzxg7Gkx7uayX089td3Srv8w,6388
28
28
  llms/ui/tailwind.input.css,sha256=QInTVDpCR89OTzRo9AePdAa-MX3i66RkhNOfa4_7UAg,12086
@@ -40,9 +40,9 @@ llms/ui/lib/servicestack-vue.mjs,sha256=EU3cnlQuTzsmPvoK50JFN98t4AO80vVNA-CS2kaS
40
40
  llms/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
41
41
  llms/ui/lib/vue.min.mjs,sha256=iXh97m5hotl0eFllb3aoasQTImvp7mQoRJ_0HoxmZkw,163811
42
42
  llms/ui/lib/vue.mjs,sha256=dS8LKOG01t9CvZ04i0tbFXHqFXOO_Ha4NmM3BytjQAs,537071
43
- llms_py-2.0.30.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
44
- llms_py-2.0.30.dist-info/METADATA,sha256=Z8sG5vefO_CfmlEX3myTw0NF8diiyoMreMTNni4w2OY,37076
45
- llms_py-2.0.30.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
- llms_py-2.0.30.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
47
- llms_py-2.0.30.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
48
- llms_py-2.0.30.dist-info/RECORD,,
43
+ llms_py-2.0.31.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
44
+ llms_py-2.0.31.dist-info/METADATA,sha256=gKqXFGqKGvYDYKOwgGlysr6CtNTPNudzCJOOjZ2LpMs,37813
45
+ llms_py-2.0.31.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ llms_py-2.0.31.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
47
+ llms_py-2.0.31.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
48
+ llms_py-2.0.31.dist-info/RECORD,,