llms-py 3.0.19__py3-none-any.whl → 3.0.21__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/ui/markdown.mjs CHANGED
@@ -23,7 +23,8 @@ export function createMarked() {
23
23
  return ret
24
24
  }
25
25
 
26
- export const marked = createMarked();
26
+ export const marked = createMarked()
27
+ export const markedFallback = createMarked()
27
28
 
28
29
  export function renderMarkdown(content) {
29
30
  if (Array.isArray(content)) {
@@ -15,6 +15,7 @@ function hasJsonStructure(str) {
15
15
  function isEmpty(v) {
16
16
  return !v || v === '{}' || v === '[]' || v === 'null' || v === 'undefined' || v === '""' || v === "''" || v === "``"
17
17
  }
18
+
18
19
  function embedHtml(html) {
19
20
  const resizeScript = `<script>
20
21
  let lastH = 0;
@@ -512,7 +513,7 @@ export const ToolArguments = {
512
513
  <TextViewer prefsName="toolArgs" :text="v" />
513
514
  </td>
514
515
  <td data-arg="value" v-else class="align-top py-2 px-4 text-sm whitespace-pre-wrap">
515
- <HtmlFormat :value="v" :classes="$utils.htmlFormatClasses" />
516
+ <HtmlFormat :value="v" :classes="$utils.htmlFormatClasses" :formatText="$utils.sanitizeHtml" />
516
517
  </td>
517
518
  </tr>
518
519
  </table>
@@ -527,6 +528,7 @@ export const ToolArguments = {
527
528
  value: String,
528
529
  },
529
530
  setup(props) {
531
+ const ctx = inject('ctx')
530
532
  const refArgs = ref()
531
533
  const maximized = ref({})
532
534
  const dict = computed(() => {
llms/ui/utils.mjs CHANGED
@@ -220,7 +220,7 @@ const htmlEntities = {
220
220
  }
221
221
 
222
222
  export function encodeHtml(str) {
223
- if (!str) return ''
223
+ if (typeof str !== 'string' || !str) return ''
224
224
  return str.replace(/[&<>"']/g, m => htmlEntities[m]);
225
225
  }
226
226
 
@@ -242,6 +242,52 @@ function htmlFormatClasses(type, tag, depth, cls, index) {
242
242
  return cls
243
243
  }
244
244
 
245
+ const dangerousTags = [
246
+ 'script',
247
+ 'iframe',
248
+ 'object',
249
+ 'embed',
250
+ 'link',
251
+ 'style',
252
+ 'meta',
253
+ 'base',
254
+ 'frame',
255
+ 'frameset',
256
+ 'applet',
257
+ 'noscript',
258
+ 'template'
259
+ ]
260
+ const anyDangerousTag = new RegExp(`<(${dangerousTags.join('|')})`, 'i')
261
+
262
+ export function sanitizeHtml(html) {
263
+ if (!html || typeof html !== 'string') return html
264
+
265
+ let result = html
266
+ let lowerResult = result.toLowerCase()
267
+ function updateResult(r) {
268
+ result = r
269
+ lowerResult = result.toLowerCase()
270
+ }
271
+
272
+ if (anyDangerousTag.test(lowerResult)) {
273
+ for (const tag of dangerousTags) {
274
+ const tagOpen = `<${tag}`
275
+
276
+ if (lowerResult.indexOf(tagOpen) === -1) continue
277
+
278
+ const regex = new RegExp(`<${tag}[^>]*>([\\s\\S]*?)<\\/${tag}>`, 'gi')
279
+ updateResult(result.replace(regex, ''))
280
+
281
+ if (lowerResult.indexOf(tagOpen) !== -1) {
282
+ const selfClosingRegex = new RegExp(`<${tag}[^>]*\\/?>`, 'gi')
283
+ updateResult(result.replace(selfClosingRegex, ''))
284
+ }
285
+ }
286
+ }
287
+
288
+ return result
289
+ }
290
+
245
291
  /**
246
292
  * Returns an ever-increasing unique integer id.
247
293
  */
@@ -280,6 +326,7 @@ export function utilsFunctions() {
280
326
  isHtml,
281
327
  htmlFormatClasses,
282
328
  encodeHtml,
329
+ sanitizeHtml,
283
330
  hashString,
284
331
  }
285
332
  }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.19
3
+ Version: 3.0.21
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
@@ -3,12 +3,12 @@ llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
3
  llms/db.py,sha256=oozp5I5lECVO8oZEFwcZl3ES5mARqWeR1BkoqG5kSqM,11687
4
4
  llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
5
5
  llms/llms.json,sha256=NEr9kJRkUGZ2YZHbWC-haGPlVVL2Qtnx4kKZENGH1wk,11494
6
- llms/main.py,sha256=Qx000NCbI_bXDLxUuRwHuOeJ5kYbPFMIUz4fB9Vi6nI,183597
6
+ llms/main.py,sha256=oQdL7MXRAYN0o7T_8AYzCSEkVmwwuRBxecwJuDj1PNY,183939
7
7
  llms/providers-extra.json,sha256=_6DmGBiQY9LM6_Y0zOiObYn7ba4g3akSNQfmHcYlENc,11101
8
- llms/providers.json,sha256=yjhDurlwo70xqfV0HNLiZaCpw3WvtIgkjoLahQIKX2w,282530
8
+ llms/providers.json,sha256=wTvlwpLMTGWz1oJWjeX9BfgLKJ2MzF99hbS8srBuUH4,286169
9
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=5TX1QZ0c4CpTpZQvoBebNLfBToTP_Sdi2tiCvbwFMd4,20799
11
+ llms/extensions/app/__init__.py,sha256=W2EHPydQuEQc71FoiCF1FFbKQ7NmB8VdpPGnTcJjNNQ,21002
12
12
  llms/extensions/app/db.py,sha256=eVUHkMo5va1pCkd3dP-4_DnkfYGZZ6oxOKOEI8hEKsM,21719
13
13
  llms/extensions/app/ui/Recents.mjs,sha256=2ypAKUp9_Oqcive1nUWZ8I2PQTBomBg_Pkjygi4oPgs,9261
14
14
  llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
@@ -19,7 +19,7 @@ llms/extensions/computer/base.py,sha256=Igio5R6kPQOxIbmpaA7X6j6eC4cpF3jwTTR8rURf
19
19
  llms/extensions/computer/bash.py,sha256=-xo67wVAdrqxtXgR7MK-iAkJ4Wne7Dm1JmnuHC2xW8o,5953
20
20
  llms/extensions/computer/computer.py,sha256=wehwcrYwi9usCRcziE_loMhWDbVgfjLk_T4_4TZa4W4,19642
21
21
  llms/extensions/computer/edit.py,sha256=QluhvRhYSSQJfbih4QyfC4M8W8aVqiOApfYXZgZTI5M,12725
22
- llms/extensions/computer/filesystem.py,sha256=4k_aq-wDySz1yV7k3ZshKr5q8LGH8gYkXgGDNAr62lc,19703
22
+ llms/extensions/computer/filesystem.py,sha256=DoyCwu8PJxhtstX39MV7cdjXu7uKzWz9yyCEEYXhzqA,21196
23
23
  llms/extensions/computer/platform.py,sha256=w5ECar8lM4Lag7rTYUQmU7wEWaqCeejNXwwM3CB8ulQ,14866
24
24
  llms/extensions/computer/run.py,sha256=ZIcoYyy2cc3IKR_T4yJgx6IUHu2m7UusIJi9Dx1s7dA,1566
25
25
  llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
@@ -143,7 +143,7 @@ llms/extensions/providers/chutes.py,sha256=5ZrfbqoOhgzKLQy_qULcp4jlvW5WXPR0jP9kN
143
143
  llms/extensions/providers/google.py,sha256=rRmpmtSjTM04mZGNyEV2jcDxdDM99GNj_X68dNT1H20,27719
144
144
  llms/extensions/providers/nvidia.py,sha256=C6cwqn3EufYDfRIgbc8MDkQNyD6w3c7hbjfYaHJSDik,4279
145
145
  llms/extensions/providers/openai.py,sha256=n1jTXkWPrboTazCW0FX3zYYaOlsW44rQpIfgKBINyCQ,6382
146
- llms/extensions/providers/openrouter.py,sha256=5SfCJKo1aGKoDGez6HXYQe9elMMo9sSEDFqqdxamAgA,3330
146
+ llms/extensions/providers/openrouter.py,sha256=9V1NSZJblku_lfsDY8Fantr5QFzkp3A0hXFDCYucShM,3344
147
147
  llms/extensions/providers/zai.py,sha256=WPJlDxmnjuhxlgWhUXw2MYqgEKYfy14wVQbpQyMMlbU,7736
148
148
  llms/extensions/skills/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
149
149
  llms/extensions/skills/__init__.py,sha256=hnbcXTc578zwxJjY3qq56UZtd-cqqVoNHxHLziOBKw4,4352
@@ -160,15 +160,15 @@ llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdo
160
160
  llms/extensions/tools/__init__.py,sha256=PRZe0QMfsOymJ3jTqO0VFppNEWI4f2bYSOImK_YrGQM,2036
161
161
  llms/extensions/tools/ui/index.mjs,sha256=1TgCn74oX_rUAhxO8w54HlIgNkHnI5ma-GCqXp-qYVY,39434
162
162
  llms/ui/App.mjs,sha256=CoUzO9mV__-jV19NKHYIbwHsjWMnO11jyNSbnJhe1gQ,7486
163
- llms/ui/ai.mjs,sha256=pLfNiOVV-Ge4siLSprj0evfm2M7KyTWxUXzy7KBo1M4,6541
164
- llms/ui/app.css,sha256=kKKICFM_85H1BDFdUYJzo93S__1OZcj2cO6zL-4VdJs,209085
165
- llms/ui/ctx.mjs,sha256=g1mmv87bhKCFyMbAImvX6mArmGliAoGPPupFEaMMf7c,14500
163
+ llms/ui/ai.mjs,sha256=-kGioRe_bMTaIMBcH65W2GaHqwrU2wvj5PBI0j40eWw,6541
164
+ llms/ui/app.css,sha256=bieInaTp18SHaTmyaptUAkTTzq_-CmVhH5q6O66ljSU,188553
165
+ llms/ui/ctx.mjs,sha256=OsAWFUmsudGFE1q5SiDdBoa2fbo67wV6LsH-hP7bv8w,15002
166
166
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
167
- llms/ui/index.mjs,sha256=7GMbFyG3L4k6dxSrQYQ0BLzqL976xw5HeaqKco0THHA,4296
168
- llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
167
+ llms/ui/index.mjs,sha256=mVR9WMuaX0TMxfZx-ZnEg1l9rKtBj9ZbhtT0lKYHlp8,4328
168
+ llms/ui/markdown.mjs,sha256=vr4zI-NrL1-Iaw-aZUD6kWbxq9yeONGO_AePZWPGe50,6692
169
169
  llms/ui/tailwind.input.css,sha256=9stg-po5X2-y598_Qw_2rnfRXR2NPjZK--d9xf-tZZE,17277
170
170
  llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
171
- llms/ui/utils.mjs,sha256=mYLTe5-CncWos4Y4z-hzvXVESKkTuVHDYTRMRGc6Ssc,7993
171
+ llms/ui/utils.mjs,sha256=HAeoyc08uEGNN2ppUfi7idVzz54ROluLS319QwQwYNs,9157
172
172
  llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
173
173
  llms/ui/lib/charts.mjs,sha256=OPFAifcA4MPRv8pw6I7glVh7Xccv8guio0k35zPBDIY,926
174
174
  llms/ui/lib/color.js,sha256=DDG7Pr-qzJHTPISZNSqP_qJR8UflKHEc_56n6xrBugQ,8273
@@ -176,19 +176,19 @@ llms/ui/lib/highlight.min.mjs,sha256=sG7wq8bF-IKkfie7S4QSyh5DdHBRf0NqQxMOEH8-MT0
176
176
  llms/ui/lib/idb.min.mjs,sha256=CeTXyV4I_pB5vnibvJuyXdMs0iVF2ZL0Z7cdm3w_QaI,3853
177
177
  llms/ui/lib/marked.min.mjs,sha256=QRHb_VZugcBJRD2EP6gYlVFEsJw5C2fQ8ImMf_pA2_s,39488
178
178
  llms/ui/lib/servicestack-client.mjs,sha256=UVafVbzhJ_0N2lzv7rlzIbzwnWpoqXxGk3N3FSKgOOc,54534
179
- llms/ui/lib/servicestack-vue.mjs,sha256=4XxQLaKm26aexbY7lYTSMRmjZmBRzZgq7F8GZquuGrs,216947
179
+ llms/ui/lib/servicestack-vue.mjs,sha256=S466x0mocUyhgkb7H9QjwO4bWIX1BxEKta4r_whffg0,217141
180
180
  llms/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
181
181
  llms/ui/lib/vue.min.mjs,sha256=T1TVu9SFEoLArPLKKEp6gsj_eScmHl5TkUebxGK6ldk,166282
182
182
  llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
183
183
  llms/ui/modules/icons.mjs,sha256=LGcH0ys0QLS2ZKCO42qHpwPYbBV_EssoWLezU4XZEzU,27751
184
184
  llms/ui/modules/layout.mjs,sha256=8pAxs8bedQI3b3eRA9nrfpLZznLmrpp4BZvigYAQjpQ,12572
185
185
  llms/ui/modules/model-selector.mjs,sha256=6U4rAZ7vmQELFRQGWk4YEtq02v3lyHdMq6yUOp-ArXg,43184
186
- llms/ui/modules/chat/ChatBody.mjs,sha256=Rwyr7JeqBn6LUn-VtHB9qj7kBsLsOr34SbHcK0twIZ0,58118
186
+ llms/ui/modules/chat/ChatBody.mjs,sha256=jusiYUxz8NoN6iYCrEayYW5t2wdOx0So79aLxjk7J9c,58187
187
187
  llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
188
188
  llms/ui/modules/chat/index.mjs,sha256=nS_L6G1RSuCybgnA6n-q8Sn3OeSbQWL2iW3-zCIFqJk,39548
189
- llms_py-3.0.19.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
190
- llms_py-3.0.19.dist-info/METADATA,sha256=jEzFKcOPn0Ibq-P_kMVrvlLe30m3qTJIWoQHa324TbQ,2195
191
- llms_py-3.0.19.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
192
- llms_py-3.0.19.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
193
- llms_py-3.0.19.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
194
- llms_py-3.0.19.dist-info/RECORD,,
189
+ llms_py-3.0.21.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
190
+ llms_py-3.0.21.dist-info/METADATA,sha256=b0dmeikPuUr-7H0uHWMi5gpS0M_27kDuVYFelXQPk04,2195
191
+ llms_py-3.0.21.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
192
+ llms_py-3.0.21.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
193
+ llms_py-3.0.21.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
194
+ llms_py-3.0.21.dist-info/RECORD,,