llms-py 3.0.6__py3-none-any.whl → 3.0.8__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.
@@ -351,6 +351,44 @@
351
351
  padding: 1em;
352
352
  }
353
353
 
354
+ /* Tool Description Code Blocks - Light Mode by default */
355
+ .tool-description pre {
356
+ background-color: #f8fafc !important;
357
+ color: #1f2937 !important;
358
+ border: 1px solid #e2e8f0;
359
+ border-radius: 0.5rem;
360
+ padding: 0.75rem 1rem;
361
+ margin: 0.75rem 0;
362
+ overflow-x: auto;
363
+ }
364
+
365
+ .tool-description code {
366
+ color: inherit !important;
367
+ }
368
+
369
+ .tool-description code.hljs {
370
+ background: transparent !important;
371
+ padding: 0;
372
+ font-size: 0.85em;
373
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
374
+ }
375
+
376
+
377
+ /* Dark Mode Overrides */
378
+ .dark .tool-description pre {
379
+ background-color: #1f2937 !important;
380
+ border-color: #374151;
381
+ color: #e5e7eb !important;
382
+ }
383
+
384
+ .dark .tool-description code {
385
+ color: inherit !important;
386
+ }
387
+
388
+ .dark .tool-description code.hljs {
389
+ color: #e5e7eb;
390
+ }
391
+
354
392
  .message pre {
355
393
  max-width: 100%;
356
394
  min-width: auto;
@@ -662,12 +700,20 @@
662
700
  .message pre {
663
701
  max-width: 500px !important;
664
702
  }
703
+
704
+ .has-iframes {
705
+ min-width: 640px;
706
+ }
665
707
  }
666
708
 
667
709
  @media (min-width: 768px) {
668
710
  .message pre {
669
711
  max-width: 600px !important;
670
712
  }
713
+
714
+ .has-iframes {
715
+ min-width: 640px;
716
+ }
671
717
  }
672
718
 
673
719
  @media (min-width: 1024px) {
@@ -676,6 +722,10 @@
676
722
  .message .prose pre {
677
723
  max-width: 700px !important;
678
724
  }
725
+
726
+ .has-iframes {
727
+ min-width: 740px;
728
+ }
679
729
  }
680
730
 
681
731
  @media (min-width: 1280px) {
@@ -684,5 +734,9 @@
684
734
  .message .prose pre {
685
735
  max-width: 800px !important;
686
736
  }
737
+
738
+ .has-iframes {
739
+ min-width: 840px;
740
+ }
687
741
  }
688
742
  }
llms/ui/utils.mjs CHANGED
@@ -97,14 +97,14 @@ export function pluralize(word, count) {
97
97
  const currFmt2 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 2 })
98
98
  const currFmt6 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 6 })
99
99
 
100
- export function tokenCost(price, tokens = 1) {
100
+ export function tokenCost(price, tokens = 1000000) {
101
101
  if (!price) return ''
102
- var ret = currFmt2.format(parseFloat(price) * tokens)
102
+ var ret = currFmt2.format(parseFloat(price) * (tokens / 1000000))
103
103
  return ret.endsWith('.00') ? ret.slice(0, -3) : ret
104
104
  }
105
- export function tokenCostLong(price, tokens = 1) {
105
+ export function tokenCostLong(price, tokens = 1000000) {
106
106
  if (!price) return ''
107
- const ret = currFmt6.format(parseFloat(price) * tokens)
107
+ const ret = currFmt6.format(parseFloat(price) * (tokens / 1000000))
108
108
  return ret.endsWith('.000000') ? ret.slice(0, -7) : ret
109
109
  }
110
110
  export function formatCost(cost) {
@@ -123,6 +123,7 @@ export function tokensTitle(usage) {
123
123
  return title.join('\n')
124
124
  }
125
125
 
126
+
126
127
  // Accessible in views via $fmt
127
128
  export function utilsFormatters() {
128
129
  function relativeTime(timestamp) {
@@ -202,6 +203,32 @@ export function utilsFormatters() {
202
203
  }
203
204
  }
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
+
205
232
  /**
206
233
  * Returns an ever-increasing unique integer id.
207
234
  */
@@ -227,6 +254,8 @@ export function utilsFunctions() {
227
254
  deepClone,
228
255
  toModelInfo,
229
256
  pluralize,
257
+ isHtml,
258
+ htmlFormatClasses,
230
259
  }
231
260
  }
232
261
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.6
3
+ Version: 3.0.8
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
@@ -2,19 +2,19 @@ llms/__init__.py,sha256=DKwTZDsyYL_wHe7yvLw49Nf8PSgPSyWaeVdotUqSvrQ,84
2
2
  llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
3
  llms/db.py,sha256=oozp5I5lECVO8oZEFwcZl3ES5mARqWeR1BkoqG5kSqM,11687
4
4
  llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
5
- llms/llms.json,sha256=esbR3GFEFura3Ajw02HjepGf0AlJPFhQlOPBjT_Lekc,11156
6
- llms/main.py,sha256=-KhtOKzdJeKj27FjIEaqKuL-dE2ejYAcnPsZrY3j0CE,157027
7
- llms/providers-extra.json,sha256=w7_5gB0YUPK0PJNeViM7vRDfNGChXUKMHfGHenVxEkM,10165
8
- llms/providers.json,sha256=Hc1STJW9hqM_MWBjeJljs_0I3bTo6qhGlEsL0o-dUuA,285221
9
- llms/extensions/analytics/ui/index.mjs,sha256=cr9dPmEJjha2xX6A_7xbJxkOolWFP1p6TgIoO8M8juI,69540
5
+ llms/llms.json,sha256=NEr9kJRkUGZ2YZHbWC-haGPlVVL2Qtnx4kKZENGH1wk,11494
6
+ llms/main.py,sha256=fqfG6QqflDwvsqUIscSMIc-15GetyBeRY4YJAIqCnSs,169747
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
10
  llms/extensions/app/README.md,sha256=TKoblZpHlheLCh_dfXOxqTc5OvxlgMBa-vKo8Hqb2gg,1370
11
- llms/extensions/app/__init__.py,sha256=eOdIGG7jrQhBZ-ndNlvbTFOhZlH9n1tG-WvqJw8cakA,20812
11
+ llms/extensions/app/__init__.py,sha256=aU8Bfliw--Xj1bsKL3PSoX6MY1ZNgweNyMWS1V_YG4s,20855
12
12
  llms/extensions/app/db.py,sha256=CqpHReXXjrLXXNxINo-wsnBJenKZVVHKlWlhtXFWj08,21503
13
- llms/extensions/app/ui/Recents.mjs,sha256=HT9R2IEus3dGEqtKPGrgX1eMp4EQ2j2jLwv-Fn1Us5E,9253
13
+ llms/extensions/app/ui/Recents.mjs,sha256=2ypAKUp9_Oqcive1nUWZ8I2PQTBomBg_Pkjygi4oPgs,9261
14
14
  llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
15
- llms/extensions/app/ui/threadStore.mjs,sha256=5qZv3maUfpLXnoEQN6EPYXUbe3B_OCgT_ttoBpvA4Dk,12192
15
+ llms/extensions/app/ui/threadStore.mjs,sha256=CLlD-1HBO1yhZBHLfL0ZdA4quT4R07qr1JW4a8igVNc,12287
16
16
  llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
17
- llms/extensions/core_tools/__init__.py,sha256=SkBBjNYM0Vxq2ftAW_0HaA1brl-VrI3rYUcjvtpEBQ4,23078
17
+ llms/extensions/core_tools/__init__.py,sha256=Y5ZlcSg5yVXxIGX_FVbDcHyeXx3ex_rzRQ2hli6Nk38,23280
18
18
  llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
19
19
  llms/extensions/core_tools/ui/codemirror/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
20
20
  llms/extensions/core_tools/ui/codemirror/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
@@ -127,30 +127,31 @@ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2,sha256=pK99QURAocF5CCXP
127
127
  llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf,sha256=8B8-h9nGphwMCBzrV3q9hk6wCmEvesFiDdaRX60u9ao,27556
128
128
  llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fWv1YRLXQMhsiNR_rxyDg3ouHI1J2Cfc,16028
129
129
  llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
130
- llms/extensions/providers/__init__.py,sha256=_fhcf1ixfiwyV2D1_BR8ZzbWF-NJm-O3D8WXjzs5eAE,484
131
- llms/extensions/providers/anthropic.py,sha256=j8TZKhD6oe8O55T6BW4qWB-vGqUkdzLv4gDjDEHlBV4,10438
130
+ llms/extensions/providers/__init__.py,sha256=C5zOBQEOB2L96rAZdjV42fPVk_dZxSh2Dv30Kb1w3lE,534
131
+ llms/extensions/providers/anthropic.py,sha256=LAOdpa_cP1zBUvSQ-ct3kVjRga-nPJ1U_KBb99N4IEk,10429
132
132
  llms/extensions/providers/cerebras.py,sha256=HaeFW0GwbD6V6Zrrwqyv78kQb0VXg9oHmykvJfIOOYE,1417
133
- llms/extensions/providers/chutes.py,sha256=JqQ6pxxcocImV3v6dwUyq33FLU44Yym_VwY-XENrowA,6331
134
- llms/extensions/providers/google.py,sha256=JBC9KZtjlwykPU4N7FpXZJH7sgsZf4B6RNRhNL79juw,24413
135
- llms/extensions/providers/nvidia.py,sha256=cMNW6HnOPckwSgkHPnGV7R60Yvdmccp2lsH-jlGlN1g,4397
136
- llms/extensions/providers/openai.py,sha256=dY8R_BDXTLMq21h-ZSoOPYkpbNl64CYUpcpbCkL8fcg,6265
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
137
  llms/extensions/providers/openrouter.py,sha256=5SfCJKo1aGKoDGez6HXYQe9elMMo9sSEDFqqdxamAgA,3330
138
+ llms/extensions/providers/zai.py,sha256=WPJlDxmnjuhxlgWhUXw2MYqgEKYfy14wVQbpQyMMlbU,7736
138
139
  llms/extensions/system_prompts/README.md,sha256=ayr18lnSsGp62bunC6kxkvcSvZki775rbZ-8VoMDQEc,597
139
140
  llms/extensions/system_prompts/__init__.py,sha256=TZy1CS2dPkBNBA_Ovf9BlVetZqTt2NgnsrZi6Mtg_C0,1535
140
141
  llms/extensions/system_prompts/ui/index.mjs,sha256=_pVCreAebSzE9dzcHF2kiYODwP-fDHCqtUQB-X5Io9Q,12107
141
142
  llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdoYDrVzfyc8TO5OaotI,128489
142
- llms/extensions/tools/__init__.py,sha256=yfIK7dVqYiZGX5VeJ3x7HQWLPQfuPqeNYJsd0lpZUM4,120
143
- llms/extensions/tools/ui/index.mjs,sha256=Nu69U6odCUh8uu1i8d5f8ryO4Lj_OFbPX2LnVyYu1fk,9602
144
- llms/ui/App.mjs,sha256=zU-GtbcSMREizjUS9nWiMK6m_oT14MNJ-p_RCz2RVqA,7445
145
- llms/ui/ai.mjs,sha256=9bLrX3OSrJBTU3wiOehxwvpInpsyvmDMkiopLiUGclY,6540
146
- llms/ui/app.css,sha256=6iQiPeFZ_7pcf6RB1b7tvh6EY22A9lCn9SCCmoJKP2I,176402
147
- llms/ui/ctx.mjs,sha256=eFTkWzVBKRU5YDFFVUq3ZDd6eMPa4VRQpE3q0O5Sfgg,12337
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=HViKrogWE2PWiu70qz7M-svbHKi1zVibdI8K2QrR6_0,6540
147
+ llms/ui/app.css,sha256=s74IHYR4RYoe8S13_yiqmHUG58M9AbDccbQ3HfdFdkg,186262
148
+ llms/ui/ctx.mjs,sha256=X4scgXEQ9bMUfQl36sM4A3o2Ufad3LRwItxfmSu1xwc,12838
148
149
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
149
- llms/ui/index.mjs,sha256=o-J2GVYYGFtfV4Pzlj-kjK4UrVP6ovTre5jD44gAiIc,4316
150
+ llms/ui/index.mjs,sha256=7GMbFyG3L4k6dxSrQYQ0BLzqL976xw5HeaqKco0THHA,4296
150
151
  llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
151
- llms/ui/tailwind.input.css,sha256=ZneSjo_uNcvqMT8cAU837yUZoLZ_sWfgr5Gto7TNJPc,15786
152
+ llms/ui/tailwind.input.css,sha256=xOrT0m8HCZRHhnPv4K43HyQCTO_0SpP-tYvxpP8jzYY,17027
152
153
  llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
153
- llms/ui/utils.mjs,sha256=Vv2YsKaOJCNYrxv19q-gU1wSuuMhEcTcm6M7_g9Ff0Y,6664
154
+ llms/ui/utils.mjs,sha256=lurZdnTk4ngR7ziWKeUNvpWVmBg2V6phqngBYWcCL5U,7483
154
155
  llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
155
156
  llms/ui/lib/charts.mjs,sha256=OPFAifcA4MPRv8pw6I7glVh7Xccv8guio0k35zPBDIY,926
156
157
  llms/ui/lib/color.js,sha256=DDG7Pr-qzJHTPISZNSqP_qJR8UflKHEc_56n6xrBugQ,8273
@@ -165,12 +166,12 @@ llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
165
166
  llms/ui/modules/icons.mjs,sha256=LGcH0ys0QLS2ZKCO42qHpwPYbBV_EssoWLezU4XZEzU,27751
166
167
  llms/ui/modules/layout.mjs,sha256=8pAxs8bedQI3b3eRA9nrfpLZznLmrpp4BZvigYAQjpQ,12572
167
168
  llms/ui/modules/model-selector.mjs,sha256=6U4rAZ7vmQELFRQGWk4YEtq02v3lyHdMq6yUOp-ArXg,43184
168
- llms/ui/modules/chat/ChatBody.mjs,sha256=YbpIEl6OeBi1RqCPkW5UFbUk6qNi5B_GfRUK5Pmfms8,42875
169
+ llms/ui/modules/chat/ChatBody.mjs,sha256=8k81r1HTxrkmLsG7xvDmYMInThiZ37xVQBfld1tLWW0,50366
169
170
  llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
170
- llms/ui/modules/chat/index.mjs,sha256=3arA5PigH6BdBDqi5SbgcNkEIETENYNNxWF3Ro7HFsM,39349
171
- llms_py-3.0.6.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
172
- llms_py-3.0.6.dist-info/METADATA,sha256=o8-oUNHj2mr942bU-M_MOWCm3LQOk0IcSl3sYrlxk6g,2191
173
- llms_py-3.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
174
- llms_py-3.0.6.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
175
- llms_py-3.0.6.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
176
- llms_py-3.0.6.dist-info/RECORD,,
171
+ llms/ui/modules/chat/index.mjs,sha256=lfSbERMaM3bLsKhdJJPWwL4-FGr8U_ftlvqW5vC3T1s,39762
172
+ llms_py-3.0.8.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
173
+ llms_py-3.0.8.dist-info/METADATA,sha256=cRqd2LtGH_jsnLN4IzvCvUQ3qnPKBLpsJTc_qDuQE1A,2191
174
+ llms_py-3.0.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
175
+ llms_py-3.0.8.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
176
+ llms_py-3.0.8.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
177
+ llms_py-3.0.8.dist-info/RECORD,,