llms-py 2.0.9__py3-none-any.whl → 3.0.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.
Files changed (194) hide show
  1. llms/__init__.py +4 -0
  2. llms/__main__.py +9 -0
  3. llms/db.py +359 -0
  4. llms/extensions/analytics/ui/index.mjs +1444 -0
  5. llms/extensions/app/README.md +20 -0
  6. llms/extensions/app/__init__.py +589 -0
  7. llms/extensions/app/db.py +536 -0
  8. {llms_py-2.0.9.data/data → llms/extensions/app}/ui/Recents.mjs +100 -73
  9. llms_py-2.0.9.data/data/ui/Sidebar.mjs → llms/extensions/app/ui/index.mjs +150 -79
  10. llms/extensions/app/ui/threadStore.mjs +433 -0
  11. llms/extensions/core_tools/CALCULATOR.md +32 -0
  12. llms/extensions/core_tools/__init__.py +637 -0
  13. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
  14. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
  15. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
  16. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
  17. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
  18. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
  19. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
  20. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
  21. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
  22. llms/extensions/core_tools/ui/codemirror/codemirror.css +344 -0
  23. llms/extensions/core_tools/ui/codemirror/codemirror.js +9884 -0
  24. llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
  25. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  26. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
  27. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
  28. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
  29. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
  30. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
  31. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
  32. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
  33. llms/extensions/core_tools/ui/index.mjs +650 -0
  34. llms/extensions/gallery/README.md +61 -0
  35. llms/extensions/gallery/__init__.py +63 -0
  36. llms/extensions/gallery/db.py +243 -0
  37. llms/extensions/gallery/ui/index.mjs +482 -0
  38. llms/extensions/katex/README.md +39 -0
  39. llms/extensions/katex/__init__.py +6 -0
  40. llms/extensions/katex/ui/README.md +125 -0
  41. llms/extensions/katex/ui/contrib/auto-render.js +338 -0
  42. llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
  43. llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
  44. llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
  45. llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
  46. llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
  47. llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
  48. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
  49. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
  50. llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
  51. llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
  52. llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
  53. llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
  54. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
  55. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
  56. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  57. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  58. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  59. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  60. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  61. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  62. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  63. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  64. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  65. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  66. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  67. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  68. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  69. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  70. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  71. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  72. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  73. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  74. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  75. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  76. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  77. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  78. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  79. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  80. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  81. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  82. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  83. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  84. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  85. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  86. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  87. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  88. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  89. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  90. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  91. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  92. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  93. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  94. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  95. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  96. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  97. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  98. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  99. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  100. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  101. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  102. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  103. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  104. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  115. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  116. llms/extensions/katex/ui/index.mjs +92 -0
  117. llms/extensions/katex/ui/katex-swap.css +1230 -0
  118. llms/extensions/katex/ui/katex-swap.min.css +1 -0
  119. llms/extensions/katex/ui/katex.css +1230 -0
  120. llms/extensions/katex/ui/katex.js +19080 -0
  121. llms/extensions/katex/ui/katex.min.css +1 -0
  122. llms/extensions/katex/ui/katex.min.js +1 -0
  123. llms/extensions/katex/ui/katex.min.mjs +1 -0
  124. llms/extensions/katex/ui/katex.mjs +18547 -0
  125. llms/extensions/providers/__init__.py +22 -0
  126. llms/extensions/providers/anthropic.py +233 -0
  127. llms/extensions/providers/cerebras.py +37 -0
  128. llms/extensions/providers/chutes.py +153 -0
  129. llms/extensions/providers/google.py +481 -0
  130. llms/extensions/providers/nvidia.py +103 -0
  131. llms/extensions/providers/openai.py +154 -0
  132. llms/extensions/providers/openrouter.py +74 -0
  133. llms/extensions/providers/zai.py +182 -0
  134. llms/extensions/system_prompts/README.md +22 -0
  135. llms/extensions/system_prompts/__init__.py +45 -0
  136. llms/extensions/system_prompts/ui/index.mjs +280 -0
  137. llms/extensions/system_prompts/ui/prompts.json +1067 -0
  138. llms/extensions/tools/__init__.py +144 -0
  139. llms/extensions/tools/ui/index.mjs +706 -0
  140. llms/index.html +58 -0
  141. llms/llms.json +400 -0
  142. llms/main.py +4407 -0
  143. llms/providers-extra.json +394 -0
  144. llms/providers.json +1 -0
  145. llms/ui/App.mjs +188 -0
  146. llms/ui/ai.mjs +217 -0
  147. llms/ui/app.css +7081 -0
  148. llms/ui/ctx.mjs +412 -0
  149. llms/ui/index.mjs +131 -0
  150. llms/ui/lib/chart.js +14 -0
  151. llms/ui/lib/charts.mjs +16 -0
  152. llms/ui/lib/color.js +14 -0
  153. llms/ui/lib/servicestack-vue.mjs +37 -0
  154. llms/ui/lib/vue.min.mjs +13 -0
  155. llms/ui/lib/vue.mjs +18530 -0
  156. {llms_py-2.0.9.data/data → llms}/ui/markdown.mjs +33 -15
  157. llms/ui/modules/chat/ChatBody.mjs +976 -0
  158. llms/ui/modules/chat/SettingsDialog.mjs +374 -0
  159. llms/ui/modules/chat/index.mjs +991 -0
  160. llms/ui/modules/icons.mjs +46 -0
  161. llms/ui/modules/layout.mjs +271 -0
  162. llms/ui/modules/model-selector.mjs +811 -0
  163. llms/ui/tailwind.input.css +742 -0
  164. {llms_py-2.0.9.data/data → llms}/ui/typography.css +133 -7
  165. llms/ui/utils.mjs +261 -0
  166. llms_py-3.0.10.dist-info/METADATA +49 -0
  167. llms_py-3.0.10.dist-info/RECORD +177 -0
  168. llms_py-3.0.10.dist-info/entry_points.txt +2 -0
  169. {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/licenses/LICENSE +1 -2
  170. llms.py +0 -1402
  171. llms_py-2.0.9.data/data/index.html +0 -64
  172. llms_py-2.0.9.data/data/llms.json +0 -447
  173. llms_py-2.0.9.data/data/requirements.txt +0 -1
  174. llms_py-2.0.9.data/data/ui/App.mjs +0 -20
  175. llms_py-2.0.9.data/data/ui/ChatPrompt.mjs +0 -389
  176. llms_py-2.0.9.data/data/ui/Main.mjs +0 -680
  177. llms_py-2.0.9.data/data/ui/app.css +0 -3951
  178. llms_py-2.0.9.data/data/ui/lib/servicestack-vue.min.mjs +0 -37
  179. llms_py-2.0.9.data/data/ui/lib/vue.min.mjs +0 -12
  180. llms_py-2.0.9.data/data/ui/tailwind.input.css +0 -261
  181. llms_py-2.0.9.data/data/ui/threadStore.mjs +0 -273
  182. llms_py-2.0.9.data/data/ui/utils.mjs +0 -114
  183. llms_py-2.0.9.data/data/ui.json +0 -1069
  184. llms_py-2.0.9.dist-info/METADATA +0 -941
  185. llms_py-2.0.9.dist-info/RECORD +0 -30
  186. llms_py-2.0.9.dist-info/entry_points.txt +0 -2
  187. {llms_py-2.0.9.data/data → llms}/ui/fav.svg +0 -0
  188. {llms_py-2.0.9.data/data → llms}/ui/lib/highlight.min.mjs +0 -0
  189. {llms_py-2.0.9.data/data → llms}/ui/lib/idb.min.mjs +0 -0
  190. {llms_py-2.0.9.data/data → llms}/ui/lib/marked.min.mjs +0 -0
  191. /llms_py-2.0.9.data/data/ui/lib/servicestack-client.min.mjs → /llms/ui/lib/servicestack-client.mjs +0 -0
  192. {llms_py-2.0.9.data/data → llms}/ui/lib/vue-router.min.mjs +0 -0
  193. {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/WHEEL +0 -0
  194. {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/top_level.txt +0 -0
@@ -31,7 +31,7 @@
31
31
  .prose :where(h4 strong):not(:where([class~="not-prose"] *)) {font-weight: 700 }
32
32
  .prose :where(figure > *):not(:where([class~="not-prose"] *)) {margin-top: 0;margin-bottom: 0 }
33
33
  .prose :where(figcaption):not(:where([class~="not-prose"] *)) {color: var(--tw-prose-captions);font-size: .875em;line-height: 1.4285714;margin-top: .8571429em }
34
- .prose :where(code):not(:where([class~="not-prose"] *)) {color: #3b82f6;font-weight: 400;font-size: .875em;background-color: #eff6ff;border:1px solid #3b83f680;border-radius: .25rem;padding: .2rem .25rem .1rem .25rem }
34
+ .prose :where(code):not(:where([class~="not-prose"] *)) {color: #3b82f6;font-weight: 400;font-size: .875em;background-color: #eff6ff;border:1px solid #3b83f680;border-radius: .25rem;padding: .2rem .25rem .1rem .25rem}
35
35
  .prose :where(code):not(:where([class~="not-prose"] *)):before {content: "" }
36
36
  .prose :where(code):not(:where([class~="not-prose"] *)):after {content: "" }
37
37
  .prose :where(a code):not(:where([class~="not-prose"] *)) {color: var(--tw-prose-links) }
@@ -94,16 +94,18 @@
94
94
  border-left-style: solid;
95
95
  }
96
96
 
97
- .dark .prose :not(:where([class~="not-prose"] *)), .dark .prose :where(td):not(:where([class~="not-prose"] *)) {
97
+ .dark .prose :where(td):not(:where([class~="not-prose"] *)) {
98
98
  color: rgb(209 213 219); /*text-gray-300*/
99
99
  }
100
100
  .dark .prose :where(h1,h2,h3,h4,h5,h6,th):not(:where([class~="not-prose"] *)) {
101
101
  color: rgb(243 244 246); /*text-gray-100*/
102
102
  }
103
- .dark .prose :where(code):not(:where([class~="not-prose"] *)) {
103
+ .dark .prose :where(code):not(:where([class~="not-prose"] *)),
104
+ .dark .message em {
104
105
  background-color: rgb(30 58 138); /*text-blue-900*/
105
106
  color: rgb(243 244 246); /*text-gray-100*/
106
107
  }
108
+
107
109
  .dark .prose :where(pre code):not(:where([class~="not-prose"] *)) {
108
110
  background-color: unset;
109
111
  }
@@ -130,10 +132,6 @@
130
132
  .not-prose { max-width: unset; }
131
133
  .prose-table { max-width: 56rem; width: 56rem; padding-left: 1px; overflow-x: auto; }
132
134
  .hide-h2+h2 { display:none }
133
- .hljs, .prose :where(pre):not(:where([class~="not-prose"] *)) .hljs {
134
- color: var(--tw-prose-pre-code) !important;
135
- background-color: var(--tw-prose-pre-bg) !important;
136
- }
137
135
  @media (min-width: 1024px) {
138
136
  .lg\:prose-xl {
139
137
  font-size: 1.25rem;
@@ -285,6 +283,12 @@
285
283
  .prose pre::-webkit-scrollbar-thumb, .prose code::-webkit-scrollbar-thumb {
286
284
  background-color: rgb(100 116 139);
287
285
  }
286
+ .dark .prose pre::-webkit-scrollbar, .dark .prose code::-webkit-scrollbar {
287
+ background: #111827;
288
+ }
289
+ .dark .prose pre::-webkit-scrollbar-thumb, .dark .prose code::-webkit-scrollbar-thumb {
290
+ background-color: rgb(71 85 105);
291
+ }
288
292
 
289
293
  .html-format {
290
294
  max-width: unset;
@@ -340,3 +344,125 @@ h1:hover .header-anchor, h1 .header-anchor:focus, h2:hover .header-anchor, h2 .h
340
344
  margin: 1rem 0rem;
341
345
  line-height: 1;
342
346
  }
347
+
348
+
349
+ /* Chat-specific styles */
350
+ .prose {
351
+ max-width: none;
352
+ }
353
+ .prose > pre {
354
+ margin-top: 0;
355
+ margin-bottom: 0;
356
+ }
357
+ .prose pre {
358
+ background-color: #1f2937;
359
+ color: #f9fafb;
360
+ border-radius: 0.5rem;
361
+ padding: 1rem;
362
+ overflow-x: auto;
363
+ }
364
+ .prose code {
365
+ /*background-color: #f3f4f6;*/
366
+ /*color: #1f2937;*/
367
+ padding: 0.125rem 0.25rem;
368
+ border-radius: 0.25rem;
369
+ font-size: 0.875em;
370
+ }
371
+ .prose pre code {
372
+ background-color: transparent;
373
+ color: inherit;
374
+ padding: 0;
375
+ }
376
+ .prose blockquote {
377
+ border-left: 4px solid #e5e7eb;
378
+ padding-left: 1rem;
379
+ font-style: italic;
380
+ color: #6b7280;
381
+ }
382
+ .prose table {
383
+ border-collapse: collapse;
384
+ width: 100%;
385
+ }
386
+ .prose th,
387
+ .prose td {
388
+ border: 1px solid #e5e7eb;
389
+ padding: 0.5rem;
390
+ text-align: left;
391
+ }
392
+ .prose th {
393
+ background-color: #f9fafb;
394
+ font-weight: 600;
395
+ }
396
+
397
+ pre {
398
+ overflow-x: auto;
399
+ font-weight: 400;
400
+ font-size: .875em;
401
+ line-height: 1.7142857;
402
+ margin-top: 1.7142857em;
403
+ margin-bottom: 1.7142857em;
404
+ border-radius: .375rem;
405
+ padding: .8571429em 1.1428571em;
406
+ max-width: calc(100vw - 1rem);
407
+ min-width: fit-content;
408
+ background-color: #282c34;
409
+ }
410
+ pre code.hljs {
411
+ display: block;
412
+ overflow-x: auto;
413
+ padding: 1em;
414
+ }
415
+ .message pre {
416
+ max-width: 100%;
417
+ min-width: auto;
418
+ }
419
+ .message pre code.hljs {
420
+ overflow-x: unset;
421
+ width: 100%;
422
+ }
423
+
424
+ /* highlight.js - vs.css */
425
+ .hljs {background:white;color:black}
426
+ .hljs-comment,.hljs-quote,.hljs-variable{color:#008000}
427
+ .hljs-keyword,.hljs-selector-tag,.hljs-built_in,.hljs-name,.hljs-tag{color:#00f}
428
+ .hljs-string,.hljs-title,.hljs-section,.hljs-attribute,.hljs-literal,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-addition{color:#a31515}
429
+ .hljs-deletion,.hljs-selector-attr,.hljs-selector-pseudo,.hljs-meta{color:#2b91af}
430
+ .hljs-doctag{color:#808080}
431
+ .hljs-attr{color: #f00}
432
+ .hljs-symbol,.hljs-bullet,.hljs-link{color:#00b0e8}
433
+ .hljs-emphasis{font-style:italic}
434
+ .hljs-strong{font-weight:bold}
435
+
436
+ /* https://unpkg.com/@highlightjs/cdn-assets/styles/atom-one-dark.min.css */
437
+ pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}.hljs{color:#abb2bf;background:#282c34}
438
+ .hljs-comment,.hljs-quote{color:#5c6370;font-style:italic}.hljs-doctag,.hljs-formula,.hljs-keyword{color:#c678dd}
439
+ .hljs-deletion,.hljs-name,.hljs-section,.hljs-selector-tag,.hljs-subst,.hljs-tag{color:#e06c75}
440
+ .hljs-literal{color:#56b6c2}
441
+ .hljs-addition,.hljs-attribute,.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#98c379}
442
+ .hljs-attr,.hljs-number,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-pseudo,.hljs-template-variable,.hljs-type,.hljs-variable{color:#d19a66}
443
+ .hljs-bullet,.hljs-link,.hljs-meta,.hljs-selector-id,.hljs-symbol,.hljs-title{color:#61aeee}
444
+ .hljs-built_in,.hljs-class .hljs-title,.hljs-title.class_{color:#e6c07b}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}
445
+ .hljs-link{text-decoration:underline}
446
+
447
+ /* Dark mode overrides for Chat-specific styles */
448
+ .dark .prose blockquote {
449
+ border-left-color: #374151;
450
+ color: #9ca3af;
451
+ }
452
+ .dark .prose th,
453
+ .dark .prose td {
454
+ border-color: #374151;
455
+ }
456
+ .dark .prose th {
457
+ background-color: #1f2937;
458
+ }
459
+ .dark .prose td {
460
+ background-color: #111827;
461
+ }
462
+ .hljs-comment, .hljs-quote {
463
+ color: rgb(148 163 184); /*text-slate-400*/
464
+ }
465
+ .dark .prose > pre, .dark .prose pre code.hljs {
466
+ background-color: #111827 !important;
467
+ color: #f3f4f6;
468
+ }
llms/ui/utils.mjs ADDED
@@ -0,0 +1,261 @@
1
+ import { toRaw } from "vue"
2
+ import { rightPart, toDate } from "@servicestack/client"
3
+
4
+ export function toJsonArray(json) {
5
+ try {
6
+ return json ? JSON.parse(json) : []
7
+ } catch (e) {
8
+ return []
9
+ }
10
+ }
11
+
12
+ export function toJsonObject(json) {
13
+ try {
14
+ return json ? JSON.parse(json) : null
15
+ } catch (e) {
16
+ return null
17
+ }
18
+ }
19
+
20
+ export function storageArray(key, save) {
21
+ if (save && Array.isArray(save)) {
22
+ localStorage.setItem(key, JSON.stringify(save))
23
+ }
24
+ return toJsonArray(localStorage.getItem(key)) ?? []
25
+ }
26
+
27
+ export function storageObject(key, save) {
28
+ if (typeof save == 'object') {
29
+ localStorage.setItem(key, JSON.stringify(save))
30
+ }
31
+ return toJsonObject(localStorage.getItem(key)) ?? {}
32
+ }
33
+
34
+ export function fileToBase64(file) {
35
+ return new Promise((resolve, reject) => {
36
+ const reader = new FileReader()
37
+ reader.readAsDataURL(file) //= "data:…;base64,…"
38
+ reader.onload = () => {
39
+ resolve(rightPart(reader.result, ',')) // strip prefix
40
+ }
41
+ reader.onerror = err => reject(err)
42
+ })
43
+ }
44
+
45
+ export function fileToDataUri(file) {
46
+ return new Promise((resolve, reject) => {
47
+ const reader = new FileReader()
48
+ reader.readAsDataURL(file) //= "data:…;base64,…"
49
+ reader.onload = () => resolve(reader.result)
50
+ reader.onerror = err => reject(err)
51
+ })
52
+ }
53
+
54
+ export function serializedClone(obj) {
55
+ try {
56
+ return JSON.parse(JSON.stringify(obj))
57
+ } catch (e) {
58
+ console.warn('Deep cloning failed, returning original value:', e)
59
+ return obj
60
+ }
61
+ }
62
+
63
+ export function deepClone(o) {
64
+ if (o === null || typeof o !== 'object') return o
65
+
66
+ // Handle Array objects
67
+ if (Array.isArray(o)) {
68
+ return o.map(x => deepClone(x))
69
+ }
70
+
71
+ if (typeof structuredClone === 'function') { // available (modern browsers, Node.js 17+)
72
+ try {
73
+ return structuredClone(o)
74
+ } catch (e) {
75
+ console.warn('structuredClone failed, falling back to JSON:', e)
76
+ console.log(o)
77
+ // console.log(JSON.stringify(o, undefined, 2))
78
+ }
79
+ }
80
+
81
+ // Fallback to JSON stringify/parse for older environments
82
+ return serializedClone(o)
83
+ }
84
+
85
+ export function toModelInfo(model) {
86
+ if (!model) return undefined
87
+ const props = ['id', 'name', 'provider', 'cost', 'modalities']
88
+ const to = {}
89
+ props.forEach(k => to[k] = toRaw(model[k]))
90
+ return deepClone(to)
91
+ }
92
+
93
+ export function pluralize(word, count) {
94
+ return count === 1 ? word : word + 's'
95
+ }
96
+
97
+ const currFmt2 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 2 })
98
+ const currFmt6 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 6 })
99
+
100
+ export function tokenCost(price, tokens = 1000000) {
101
+ if (!price) return ''
102
+ var ret = currFmt2.format(parseFloat(price) * (tokens / 1000000))
103
+ return ret.endsWith('.00') ? ret.slice(0, -3) : ret
104
+ }
105
+ export function tokenCostLong(price, tokens = 1000000) {
106
+ if (!price) return ''
107
+ const ret = currFmt6.format(parseFloat(price) * (tokens / 1000000))
108
+ return ret.endsWith('.000000') ? ret.slice(0, -7) : ret
109
+ }
110
+ export function formatCost(cost) {
111
+ if (!cost) return ''
112
+ return currFmt2.format(parseFloat(cost))
113
+ }
114
+ export function tokensTitle(usage) {
115
+ let title = []
116
+ if (usage.tokens && usage.price) {
117
+ const msg = parseFloat(usage.price) > 0
118
+ ? `${usage.tokens} tokens @ ${usage.price} = ${tokenCostLong(usage.price, usage.tokens)}`
119
+ : `${usage.tokens} tokens`
120
+ const duration = usage.duration ? ` in ${usage.duration}ms` : ''
121
+ title.push(msg + duration)
122
+ }
123
+ return title.join('\n')
124
+ }
125
+
126
+
127
+ // Accessible in views via $fmt
128
+ export function utilsFormatters() {
129
+ function relativeTime(timestamp) {
130
+ const now = new Date()
131
+ const date = new Date(timestamp)
132
+ const diffInSeconds = Math.floor((now - date) / 1000)
133
+
134
+ if (diffInSeconds < 60) return 'Just now'
135
+ if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}m ago`
136
+ if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}h ago`
137
+ if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)}d ago`
138
+
139
+ return date.toLocaleDateString()
140
+ }
141
+ function costLong(cost) {
142
+ if (!cost) return ''
143
+ const ret = currFmt6.format(parseFloat(cost))
144
+ return ret.endsWith('.000000') ? ret.slice(0, -7) : ret
145
+ }
146
+ function statsTitle(stats) {
147
+ let title = []
148
+ // Each stat on its own line
149
+ if (stats.cost) {
150
+ title.push(`Total Cost: ${costLong(stats.cost)}`)
151
+ }
152
+ if (stats.inputTokens) {
153
+ title.push(`Input Tokens: ${stats.inputTokens}`)
154
+ }
155
+ if (stats.outputTokens) {
156
+ title.push(`Output Tokens: ${stats.outputTokens}`)
157
+ }
158
+ if (stats.requests) {
159
+ title.push(`Requests: ${stats.requests}`)
160
+ }
161
+ if (stats.duration) {
162
+ title.push(`Duration: ${stats.duration}ms`)
163
+ }
164
+ return title.join('\n')
165
+ }
166
+
167
+ function time(timestamp) {
168
+ return new Date(timestamp).toLocaleTimeString([], {
169
+ hour: '2-digit',
170
+ minute: '2-digit'
171
+ })
172
+ }
173
+
174
+ function shortDate(ts) {
175
+ if (!ts) return ''
176
+ const date = typeof ts === 'number' ? new Date(ts * 1000) : new Date(ts)
177
+ return date.toLocaleDateString(undefined, {
178
+ month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'
179
+ })
180
+ }
181
+
182
+ function date(d) {
183
+ date = toDate(d)
184
+ return date.toLocaleDateString(undefined, {
185
+ month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'
186
+ })
187
+ }
188
+
189
+
190
+ return {
191
+ currFmt: currFmt2,
192
+ tokenCost,
193
+ tokenCostLong,
194
+ tokensTitle,
195
+ cost: formatCost,
196
+ costLong,
197
+ statsTitle,
198
+ relativeTime,
199
+ time,
200
+ pluralize,
201
+ shortDate,
202
+ date,
203
+ }
204
+ }
205
+
206
+ const htmlStartTags = ['<!doctype', '<html', '<head', '<body', '<script', '<style', '<link']
207
+ export function isHtml(s) {
208
+ if (!s || typeof s != 'string') return false
209
+ const lower = s.toLowerCase().trim()
210
+ const isHtml = htmlStartTags.some(tag => lower.startsWith(tag))
211
+ return isHtml
212
+ }
213
+
214
+ /**
215
+ * @param {object|array} type
216
+ * @param {'div'|'table'|'thead'|'th'|'tr'|'td'} tag
217
+ * @param {number} depth
218
+ * @param {string} cls
219
+ * @param {number} index
220
+ */
221
+ function htmlFormatClasses(type, tag, depth, cls, index) {
222
+ cls = cls.replace('shadow ring-1 ring-black/5 md:rounded-lg', '')
223
+ if (tag == 'th') {
224
+ cls += ' lowercase'
225
+ }
226
+ if (tag == 'td') {
227
+ cls += ' whitespace-pre-wrap'
228
+ }
229
+ return cls
230
+ }
231
+
232
+ /**
233
+ * Returns an ever-increasing unique integer id.
234
+ */
235
+ export const nextId = (() => {
236
+ let last = 0 // cache of the last id that was handed out
237
+ return () => {
238
+ const now = Date.now() // current millisecond timestamp
239
+ last = (now > last) ? now : last + 1
240
+ return last
241
+ }
242
+ })();
243
+
244
+ export function utilsFunctions() {
245
+ return {
246
+ nextId,
247
+ toJsonArray,
248
+ toJsonObject,
249
+ storageArray,
250
+ storageObject,
251
+ fileToBase64,
252
+ fileToDataUri,
253
+ serializedClone,
254
+ deepClone,
255
+ toModelInfo,
256
+ pluralize,
257
+ isHtml,
258
+ htmlFormatClasses,
259
+ }
260
+ }
261
+
@@ -0,0 +1,49 @@
1
+ Metadata-Version: 2.4
2
+ Name: llms-py
3
+ Version: 3.0.10
4
+ Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
+ Home-page: https://github.com/ServiceStack/llms
6
+ Author: ServiceStack
7
+ Author-email: ServiceStack <team@servicestack.net>
8
+ Maintainer-email: ServiceStack <team@servicestack.net>
9
+ License-Expression: BSD-3-Clause
10
+ Project-URL: Homepage, https://github.com/ServiceStack/llms
11
+ Project-URL: Documentation, https://github.com/ServiceStack/llms#readme
12
+ Project-URL: Repository, https://github.com/ServiceStack/llms
13
+ Project-URL: Bug Reports, https://github.com/ServiceStack/llms/issues
14
+ Keywords: llm,ai,openai,anthropic,google,gemini,groq,mistral,ollama,cli,server,chat,completion
15
+ Classifier: Development Status :: 5 - Production/Stable
16
+ Classifier: Intended Audience :: Developers
17
+ Classifier: Intended Audience :: System Administrators
18
+ Classifier: Operating System :: OS Independent
19
+ Classifier: Programming Language :: Python :: 3
20
+ Classifier: Programming Language :: Python :: 3.7
21
+ Classifier: Programming Language :: Python :: 3.8
22
+ Classifier: Programming Language :: Python :: 3.9
23
+ Classifier: Programming Language :: Python :: 3.10
24
+ Classifier: Programming Language :: Python :: 3.11
25
+ Classifier: Programming Language :: Python :: 3.12
26
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
27
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
28
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
29
+ Classifier: Topic :: System :: Systems Administration
30
+ Classifier: Topic :: Utilities
31
+ Classifier: Environment :: Console
32
+ Requires-Python: >=3.7
33
+ Description-Content-Type: text/markdown
34
+ License-File: LICENSE
35
+ Requires-Dist: aiohttp
36
+ Dynamic: author
37
+ Dynamic: home-page
38
+ Dynamic: license-file
39
+ Dynamic: requires-python
40
+
41
+ # llms.py
42
+
43
+ Lightweight CLI, API and ChatGPT-like alternative to Open WebUI for accessing multiple LLMs, entirely offline, with all data kept private in browser storage.
44
+
45
+ [llmspy.org](https://llmspy.org)
46
+
47
+ [![](https://github.com/ServiceStack/llmspy.org/blob/main/public/img/llmspy-home.webp?raw=true)](https://llmspy.org)
48
+
49
+ GitHub: [llmspy.org](https://github.com/ServiceStack/llmspy.org)
@@ -0,0 +1,177 @@
1
+ llms/__init__.py,sha256=DKwTZDsyYL_wHe7yvLw49Nf8PSgPSyWaeVdotUqSvrQ,84
2
+ llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
+ llms/db.py,sha256=oozp5I5lECVO8oZEFwcZl3ES5mARqWeR1BkoqG5kSqM,11687
4
+ llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
5
+ llms/llms.json,sha256=NEr9kJRkUGZ2YZHbWC-haGPlVVL2Qtnx4kKZENGH1wk,11494
6
+ llms/main.py,sha256=ZSRfpbTGMJjU_H65Iz4I6aDBmEQjFnfUwSGRr4SJfQg,169748
7
+ llms/providers-extra.json,sha256=_6DmGBiQY9LM6_Y0zOiObYn7ba4g3akSNQfmHcYlENc,11101
8
+ llms/providers.json,sha256=yjhDurlwo70xqfV0HNLiZaCpw3WvtIgkjoLahQIKX2w,282530
9
+ llms/extensions/analytics/ui/index.mjs,sha256=m1XwaqYCLwK267JAUCAltkN_nOXep0GxfpvGNS5i4_w,69547
10
+ llms/extensions/app/README.md,sha256=TKoblZpHlheLCh_dfXOxqTc5OvxlgMBa-vKo8Hqb2gg,1370
11
+ llms/extensions/app/__init__.py,sha256=aU8Bfliw--Xj1bsKL3PSoX6MY1ZNgweNyMWS1V_YG4s,20855
12
+ llms/extensions/app/db.py,sha256=CqpHReXXjrLXXNxINo-wsnBJenKZVVHKlWlhtXFWj08,21503
13
+ llms/extensions/app/ui/Recents.mjs,sha256=2ypAKUp9_Oqcive1nUWZ8I2PQTBomBg_Pkjygi4oPgs,9261
14
+ llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
15
+ llms/extensions/app/ui/threadStore.mjs,sha256=CLlD-1HBO1yhZBHLfL0ZdA4quT4R07qr1JW4a8igVNc,12287
16
+ llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
17
+ llms/extensions/core_tools/__init__.py,sha256=Y5ZlcSg5yVXxIGX_FVbDcHyeXx3ex_rzRQ2hli6Nk38,23280
18
+ llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
19
+ llms/extensions/core_tools/ui/codemirror/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
20
+ llms/extensions/core_tools/ui/codemirror/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
21
+ llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js,sha256=FDwwFMKSVPNTHMML5tkCBQhLz8Ns_6b5sqRv1CpAviA,7123
22
+ llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js,sha256=b74rk8wXRNnhStHWE0SffhbfTCqihC9ljvwXq_Zi-FA,8544
23
+ llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js,sha256=a6nNlSi3Tn929LnOntBne_7XBX0areAFAYU2jP0OouM,3989
24
+ llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js,sha256=nSOhd_Hk0H46zDfCEP--TBwutNVbvlTBbT5609BNBAE,6815
25
+ llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js,sha256=Jj11L4ULIIkPBQb8snewlLR0E4aSpYtF17m7A-IKoAw,2358
26
+ llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js,sha256=oNLAGW2PSZHNWPMgSY967Olx5QLkgR7PWMta-OgwB8Y,1006
27
+ llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js,sha256=OvvPeINcm9w0LjmSxT2bdChnImE7saitydFA7chzfug,2509
28
+ llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js,sha256=W5xqADH-iVZB8ushmN8lkux2mmaF1rsQ8_m5Kngi4oY,3849
29
+ llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js,sha256=_df_U9DKeWxeN5LOtQY8hNBzW8rxmKHAbHiIDxxmSiI,3295
30
+ llms/extensions/core_tools/ui/codemirror/doc/docs.css,sha256=apFfZ7aIURmhMA5bPWqPasrUeNQQbyIj3RQ8A5cwV94,3315
31
+ llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff,sha256=4ppXym_xSqFSK1sYxUPXogFs3Xu6YyHWBN-jUZ8Osec,29448
32
+ llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js,sha256=BYoKZKIGseTbzBmm_6QBWoS7a_4T0LqFdovhHe9bTtI,37362
33
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html,sha256=K5xIggY1lgSYrcM9UhLcniq6G5zM_4Jl29cb_1YvHFQ,4668
34
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js,sha256=9do6jQ3GPCXs0-d8rPV89EMd8Lq_WU_TsZwrHT4imic,40636
35
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html,sha256=38VEYk6oEcuTMvAP18XpxZmrcX5HOzewZGHZalYjt3E,1610
36
+ llms/extensions/core_tools/ui/codemirror/mode/python/python.js,sha256=GaWco4et2wTpUALJrb4rjCMUJ85JNprFNxB-MIimlHw,14984
37
+ llms/extensions/core_tools/ui/codemirror/theme/dracula.css,sha256=Av32BJYI3djQ189kA7blslEzB0Dfw5N3T2i7ZHJ7PG4,2042
38
+ llms/extensions/core_tools/ui/codemirror/theme/mocha.css,sha256=0Y1y9DUgzBSakbXep55HuqOYiPMC-YK3xjVQBiwUQ4g,2402
39
+ llms/extensions/gallery/README.md,sha256=zif27qiMef1dBboMEPvTJqPDnLvrqntraVSw8oQ-1RM,2985
40
+ llms/extensions/gallery/__init__.py,sha256=24cABEIyqD0zLi32Jrqxoe-qdsS_q4mdJK7NgS0SiEY,1756
41
+ llms/extensions/gallery/db.py,sha256=IgiwBnqdGf0GYWCltphLD0NWS_MnbPDpRUJszh2_DW0,9032
42
+ llms/extensions/gallery/ui/index.mjs,sha256=ieslBFVadnzS7LYecvFh19T9r0Ff8OAdwHCWWoV9lsc,28297
43
+ llms/extensions/katex/README.md,sha256=fD_0riNXrKW0SfehifIc3jnXKg9diQdlXVq5X_e1zTc,1473
44
+ llms/extensions/katex/__init__.py,sha256=CvEe9CPtzoANc4AFuxZTbrJZdggoWLuKnENKfEdncPQ,206
45
+ llms/extensions/katex/ui/README.md,sha256=Xkjgncuvv4WT4TzNX4muWHYKJOwZ-kSpNnyveLlJDNU,7268
46
+ llms/extensions/katex/ui/index.mjs,sha256=K54EGfcnQwvqmPiJAMgNplnq1t9AaCHsXvTcVBdbl_4,2829
47
+ llms/extensions/katex/ui/katex-swap.css,sha256=TFnBXg_P8omwxMkHbFFw7jRpnB11EGzV-z2NdUVi_x4,31769
48
+ llms/extensions/katex/ui/katex-swap.min.css,sha256=Fsj_aVHG8yCYtx4Zifq8j5Vl73MhOT-jUFEzrwwr-pM,23712
49
+ llms/extensions/katex/ui/katex.css,sha256=4UJ6yBPVaG2svf0OK6NvOK-NnIhG4M3i3B7L7VvKgmQ,31789
50
+ llms/extensions/katex/ui/katex.js,sha256=PWy90_IeY834xVXGb85bYKRc5gvaKq6dgIBNwjEPmJE,622633
51
+ llms/extensions/katex/ui/katex.min.css,sha256=4Yn9AjiBGYnDZG3Ovai8DPsex5G3nmDPnRjwWknIoBY,23732
52
+ llms/extensions/katex/ui/katex.min.js,sha256=a5CUQ-bI9uXSTMSHL-kJpUdwdiBHrpXj809V7C5vbDo,276705
53
+ llms/extensions/katex/ui/katex.min.mjs,sha256=KmfOVfgFWMddI3U_-lA5BJP_E0D_tnol5rdQNbUlKho,267755
54
+ llms/extensions/katex/ui/katex.mjs,sha256=1qAo5SYTN8yq6uIYB1alXX-BYw_JDnTSdOsCRNxPuJ8,610115
55
+ llms/extensions/katex/ui/contrib/auto-render.js,sha256=H1SS5odSobH7zVAIQModAZHCYTH9w2OBtJOgLGuNS88,10508
56
+ llms/extensions/katex/ui/contrib/auto-render.min.js,sha256=u1PrlTOUUxquNv3VNwZcQkTrhUKQGjzpFGAdkyZ1uKw,3467
57
+ llms/extensions/katex/ui/contrib/auto-render.mjs,sha256=QtMkCZDUVDbW3U37Nud5JEjNwrYCxHrEJP0Jsek9vf4,6840
58
+ llms/extensions/katex/ui/contrib/copy-tex.js,sha256=Kgy7CBbqP6RViyyBD4M_2cLik3CImMSh5ZBhfJqyBOs,4507
59
+ llms/extensions/katex/ui/contrib/copy-tex.min.js,sha256=B3cK-QlDod4aEBB5S8eManNG1G1I-2PjXMdrp2uCdgQ,1673
60
+ llms/extensions/katex/ui/contrib/copy-tex.mjs,sha256=0De3xM3HNCAoWlgOW4-ctEGtZ-Zh_RrTHdRarc8Ee_U,3640
61
+ llms/extensions/katex/ui/contrib/mathtex-script-type.js,sha256=ZCkQ0MIYkiD02D9XnYxhHvDC10xDDFxfXQrKhhxcaxI,4207
62
+ llms/extensions/katex/ui/contrib/mathtex-script-type.min.js,sha256=B5myi4vIBiH8htnO5Fz9HKSZ9309bXGw7jBxWPw7ULk,1290
63
+ llms/extensions/katex/ui/contrib/mathtex-script-type.mjs,sha256=V_UZsiMDB8dNCAIPUshZyWn1Un60DSS7irPiFngI1cY,751
64
+ llms/extensions/katex/ui/contrib/mhchem.js,sha256=ra4CiB7OdQzkMKpbJQxU4j4OPRhUx_80jftes02vaHo,78705
65
+ llms/extensions/katex/ui/contrib/mhchem.min.js,sha256=n4fl6cOEoWBHLQBFA1qGQfYBM1jt2z7OcIY0pQ-UakA,33712
66
+ llms/extensions/katex/ui/contrib/mhchem.mjs,sha256=xdS2inkhwhj_3PTXwXkA14Ove0hDBROBDLFOeRpUq7Q,75577
67
+ llms/extensions/katex/ui/contrib/render-a11y-string.js,sha256=pfoN2Rsz0kzmtqstQTKCWEKqKGwUsED2aNzZJxdJc4c,23938
68
+ llms/extensions/katex/ui/contrib/render-a11y-string.min.js,sha256=eQIPbKYpwHvd8iccbQV-jlXo4lFCikk96DnIlPcTFg0,8454
69
+ llms/extensions/katex/ui/contrib/render-a11y-string.mjs,sha256=Xfgg3ZN2vSPvQk5c_EVQXVeuZG-wxVM3WOetUeBIiTs,20283
70
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf,sha256=aFNIQLz90r_7bw6N60hoTdAefwTqKBMmdXevuQbeHRM,63632
71
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff,sha256=MNqR6EyJP4deJSaJ-uvcWQsocRReitx_mp1NvYzgslE,33516
72
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2,sha256=DN04fJWQoan5eUVgAi27WWVKfYbxh6oMgUla1C06cwg,28076
73
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf,sha256=B9jjA85PwStLtU8QBBcN0ZCh89tF1AD-aAYN8-CJcmg,12368
74
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff,sha256=Gua9dHVZDpfn8UWongnM3jIvemvAuRYHsci47igpD-0,7716
75
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2,sha256=3ncB5Czx9M8LdmwD-yeXcgfu4vT9XXb6ghiEBtpD6kw,6912
76
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf,sha256=7Qt0Ny_u_LucBmay4hDaN7fkn6f7vz7rEdtfaT2s-7c,12344
77
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff,sha256=M5jdAjAlV6eT8oY_iOAtls4Q3yq_-gfI6fqQd1EW5lw,7656
78
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2,sha256=XVPnCtYHwjUhYt7J4JI_tU7Nr6zL9gTNjc99APrLmJs,6908
79
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf,sha256=kWPfnHEiQy5klbQin6kHHPmuhqdYrl78SSTsLhptvOE,19584
80
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff,sha256=m-fOuIAEq4rRJAgiRvv8ykCR42OF1Oxu0d9nN12tUPs,13296
81
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2,sha256=dERO_Vk8AF4_RXO0RSRwTArwqTf-kRzKnpQGjQ0UDT8,11348
82
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf,sha256=Hm-VeekOLKw3-PYKWXxDbgdcEUOFZSt8vrDewEISkbM,19572
83
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff,sha256=Xih1O-cX2sl_VZ9JvBC-nPPBJN3KvaZlnRHLaP68ZGM,13208
84
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2,sha256=UYFNJw0G_wJV26B5mZT6TYyE0R8JlR1HWV9Kux82Atw,11316
85
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf,sha256=E4rCjRZjswN-nF9SNx-lxj2DJPSjjSLNVz5uo6P9DPg,51336
86
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff,sha256=x2xdaWKX1RucsWOcfaQzTw597IG0KxEhO14l72cbuCI,29912
87
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2,sha256=D2DRuJeTjskYyM4HMJJBG6-UOPZzlGVpP_GLD50gsCE,25324
88
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf,sha256=cO4fZKIPIEjCGUDvRtAUT9IVuqlTymmv0eMemFRPcI8,32968
89
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff,sha256=pvfsDYRqx62XWtuJWcN-1JuUrLxK5DbbnOniAofkpkw,19412
90
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2,sha256=mc1Co8By2Rjy9EmEqAfPeqFuE1Rf0IdfwHxsZfmecVs,16780
91
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf,sha256=DYWufMMPI3kKfxpYxKES_cqKrnaba6EUKa8dmLG2yzo,33580
92
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff,sha256=8dbvhvOxGlKL1RhRmb0kQ-yysN6tltiGdLWiwSviS98,19676
93
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2,sha256=l0ecpszpBqvJYeyslvql-couYbjnZw1HWCa83umnwmc,16988
94
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf,sha256=0DMvUoaDcP2Drn-kZHD5DI8uqy_PErxPiAgLNAyVqDA,53580
95
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff,sha256=xjaNh-iho6XTN2I9g9jcS4aPJCqa1HYjfW-NHg8WjNw,30772
96
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2,sha256=wjQs2Lhp4BdSqTIdwXIT_EDU0Ex5aIwdQ_LPMWq9eGY,26272
97
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf,sha256=-Td6sCcc2lmvJLz_vUak0MijVy_6_bs43irV6nsNXuU,31196
98
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff,sha256=hQwK9cIjhJf-uvXkYdiAv0WMNB9C9PMw8bGrVpixmY4,18668
99
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2,sha256=3Ec0TbtstbZVyEYNVh9N9fUBuQyAStPGzsZf4yI1GrE,16400
100
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf,sha256=CM6Y5RsE1YlFowHmOeAraZivKf39Yae4r90Hu_xHnUo,31308
101
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff,sha256=io0kRYE3GRK48_WiPiQ3yypZzZvK67A0bnIsBXN6JXE,18748
102
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2,sha256=evWMXsjxMqLd3pAnxteBTezOTTuCKhEZKkKiDi6XMmQ,16440
103
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf,sha256=Hs4D95-VJ31X3H9rQ1p04TebDUYQSoUwKGtg_0k2nqA,24504
104
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff,sha256=7OA8_YPiLCEs3vZv64RC0loIO-uYjbPxiD8_lzjXULo,14408
105
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2,sha256=6ZrlEUS_EjLvzBv-Wt02JixoZrD6qyT6dXQOG5hXemI,12216
106
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf,sha256=OTHdgfrthroCG7K73Db1vtmjjWtPQHespZsmWqGwIIM,22364
107
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff,sha256=ke5nUAzAEpqgrOOsXGH_FpIQLw8x0CtpNH-6Ndy3W_I,14112
108
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2,sha256=ALJqyCXiCVBWOW4FU7isJtP4rRWMOCbii0xFs4XEcUo,12028
109
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf,sha256=826ol-GfSi5XHR6QDk43EOQ43rBahCSGBFugo-YWpK0,19436
110
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff,sha256=EeTcimRx_21u5WHVPRD96PdInnmCV_9EnF03wZdDVgU,12316
111
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2,sha256=aOjHPvQq_TzOxYvw-6MCzORIk45_wCCl4x-KlS7uE0I,10344
112
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf,sha256=HGfwaP6ouwm_CZwIixz2S9J1Fqbgf0aENEhzVku2amc,16648
113
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff,sha256=2WzfKzvdTWSo_V90pMRn8SOopzkxzUNYifCP-vm_lHo,10588
114
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2,sha256=A21OlRSbaf-bzAzVV3Hv6yX_o5Ryk-aazXjVrDKMaEs,9644
115
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf,sha256=lbbS8aUBc7_tuMY-HRyZsQQn0KTfQgHLRFE7ImlRois,12228
116
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff,sha256=yUPMmGOE9Z6GvqX9fcUKnE3-Vnp8BetA1nkHIN6tl8k,6496
117
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2,sha256=a0fEAWa22-IaXfyncYQT8hR_0jmb4bpgXYrTnO3yXf4,5468
118
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf,sha256=prIJn7VVxg46DbOgiELr8dcyxutOS_RJE2E77U_E45s,11508
119
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff,sha256=IBTFI8MhC8wWZkjE1MxX8Ft0ffB6JCd79xxR5n3Hnj0,6188
120
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2,sha256=0ExUIZ-ersbU1P1C37KHhZdaR5TWsvxx5Wa5zW24Qt0,5208
121
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf,sha256=UA4E1U8NUWZjMsnSCJqoA74iqoeOylOeWfpTxuUisII,7588
122
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff,sha256=ara2Lpti2uLADdkPeRvRCVC-Dsw0kNfWBF9Rwuj-CUk,4420
123
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2,sha256=c9WRJxsWBJYMsQu5D-4CFnCvcpcBfg6YSAszLRH1GZU,3624
124
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf,sha256=xkc2fR3U4WJGhxfQIOH8Dx3Fwm6_3_vlUmFxO_iMWHc,10364
125
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff,sha256=mfnGdQtInJRivwSQC9P5Od-bgpM52qqqme9Ulc3d6lg,5980
126
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2,sha256=pK99QURAocF5CCXPtwDPnPQ7DyxLBPDrxSMBGtmFPsA,4928
127
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf,sha256=8B8-h9nGphwMCBzrV3q9hk6wCmEvesFiDdaRX60u9ao,27556
128
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fWv1YRLXQMhsiNR_rxyDg3ouHI1J2Cfc,16028
129
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
130
+ llms/extensions/providers/__init__.py,sha256=C5zOBQEOB2L96rAZdjV42fPVk_dZxSh2Dv30Kb1w3lE,534
131
+ llms/extensions/providers/anthropic.py,sha256=LAOdpa_cP1zBUvSQ-ct3kVjRga-nPJ1U_KBb99N4IEk,10429
132
+ llms/extensions/providers/cerebras.py,sha256=HaeFW0GwbD6V6Zrrwqyv78kQb0VXg9oHmykvJfIOOYE,1417
133
+ llms/extensions/providers/chutes.py,sha256=5ZrfbqoOhgzKLQy_qULcp4jlvW5WXPR0jP9kN2Jzb9g,6229
134
+ llms/extensions/providers/google.py,sha256=9P90bEefRA18tpjfEuAz1T5YpwzdOngrTFhw-LI3eXg,24434
135
+ llms/extensions/providers/nvidia.py,sha256=C6cwqn3EufYDfRIgbc8MDkQNyD6w3c7hbjfYaHJSDik,4279
136
+ llms/extensions/providers/openai.py,sha256=hkE-LVsw6M92_qEbpayuPo17Z1OWKHe7lm2wduLMng8,6138
137
+ llms/extensions/providers/openrouter.py,sha256=5SfCJKo1aGKoDGez6HXYQe9elMMo9sSEDFqqdxamAgA,3330
138
+ llms/extensions/providers/zai.py,sha256=WPJlDxmnjuhxlgWhUXw2MYqgEKYfy14wVQbpQyMMlbU,7736
139
+ llms/extensions/system_prompts/README.md,sha256=ayr18lnSsGp62bunC6kxkvcSvZki775rbZ-8VoMDQEc,597
140
+ llms/extensions/system_prompts/__init__.py,sha256=TZy1CS2dPkBNBA_Ovf9BlVetZqTt2NgnsrZi6Mtg_C0,1535
141
+ llms/extensions/system_prompts/ui/index.mjs,sha256=_pVCreAebSzE9dzcHF2kiYODwP-fDHCqtUQB-X5Io9Q,12107
142
+ llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdoYDrVzfyc8TO5OaotI,128489
143
+ llms/extensions/tools/__init__.py,sha256=u76604Cn_sRFQRqeA_pkVEty27V688Mt9Z7Kh63yDr8,4825
144
+ llms/extensions/tools/ui/index.mjs,sha256=IbGB2FQJ5VL4a8arwoR9C79vUCNrz8VIyQnHZ4vxU9o,34486
145
+ llms/ui/App.mjs,sha256=CoUzO9mV__-jV19NKHYIbwHsjWMnO11jyNSbnJhe1gQ,7486
146
+ llms/ui/ai.mjs,sha256=F4MaotQJDO60uHJBC6tA4dlQE1aPOR28tvLU670sLIs,6541
147
+ llms/ui/app.css,sha256=vfXErYVdVlE3pL8oZ-2G_OC-_reJzmaL0p91EVv48uo,186490
148
+ llms/ui/ctx.mjs,sha256=X4scgXEQ9bMUfQl36sM4A3o2Ufad3LRwItxfmSu1xwc,12838
149
+ llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
150
+ llms/ui/index.mjs,sha256=7GMbFyG3L4k6dxSrQYQ0BLzqL976xw5HeaqKco0THHA,4296
151
+ llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
152
+ llms/ui/tailwind.input.css,sha256=xOrT0m8HCZRHhnPv4K43HyQCTO_0SpP-tYvxpP8jzYY,17027
153
+ llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
154
+ llms/ui/utils.mjs,sha256=lurZdnTk4ngR7ziWKeUNvpWVmBg2V6phqngBYWcCL5U,7483
155
+ llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
156
+ llms/ui/lib/charts.mjs,sha256=OPFAifcA4MPRv8pw6I7glVh7Xccv8guio0k35zPBDIY,926
157
+ llms/ui/lib/color.js,sha256=DDG7Pr-qzJHTPISZNSqP_qJR8UflKHEc_56n6xrBugQ,8273
158
+ llms/ui/lib/highlight.min.mjs,sha256=sG7wq8bF-IKkfie7S4QSyh5DdHBRf0NqQxMOEH8-MT0,127458
159
+ llms/ui/lib/idb.min.mjs,sha256=CeTXyV4I_pB5vnibvJuyXdMs0iVF2ZL0Z7cdm3w_QaI,3853
160
+ llms/ui/lib/marked.min.mjs,sha256=QRHb_VZugcBJRD2EP6gYlVFEsJw5C2fQ8ImMf_pA2_s,39488
161
+ llms/ui/lib/servicestack-client.mjs,sha256=UVafVbzhJ_0N2lzv7rlzIbzwnWpoqXxGk3N3FSKgOOc,54534
162
+ llms/ui/lib/servicestack-vue.mjs,sha256=4XxQLaKm26aexbY7lYTSMRmjZmBRzZgq7F8GZquuGrs,216947
163
+ llms/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
164
+ llms/ui/lib/vue.min.mjs,sha256=T1TVu9SFEoLArPLKKEp6gsj_eScmHl5TkUebxGK6ldk,166282
165
+ llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
166
+ llms/ui/modules/icons.mjs,sha256=LGcH0ys0QLS2ZKCO42qHpwPYbBV_EssoWLezU4XZEzU,27751
167
+ llms/ui/modules/layout.mjs,sha256=8pAxs8bedQI3b3eRA9nrfpLZznLmrpp4BZvigYAQjpQ,12572
168
+ llms/ui/modules/model-selector.mjs,sha256=6U4rAZ7vmQELFRQGWk4YEtq02v3lyHdMq6yUOp-ArXg,43184
169
+ llms/ui/modules/chat/ChatBody.mjs,sha256=5yWjo6tWmcKidDpRvKFeHqx3lXO3DB-3rTyXY72gB4U,49122
170
+ llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
171
+ llms/ui/modules/chat/index.mjs,sha256=lfSbERMaM3bLsKhdJJPWwL4-FGr8U_ftlvqW5vC3T1s,39762
172
+ llms_py-3.0.10.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
173
+ llms_py-3.0.10.dist-info/METADATA,sha256=IWZDosCH-2jQpFVfSZ4YEUHqOkph9QdILhpQspYVfCc,2192
174
+ llms_py-3.0.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
175
+ llms_py-3.0.10.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
176
+ llms_py-3.0.10.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
177
+ llms_py-3.0.10.dist-info/RECORD,,