llms-py 3.0.10__py3-none-any.whl → 3.0.18__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 (41) hide show
  1. llms/extensions/app/__init__.py +0 -1
  2. llms/extensions/app/db.py +7 -3
  3. llms/extensions/app/ui/threadStore.mjs +10 -3
  4. llms/extensions/computer/README.md +96 -0
  5. llms/extensions/computer/__init__.py +59 -0
  6. llms/extensions/computer/base.py +80 -0
  7. llms/extensions/computer/bash.py +185 -0
  8. llms/extensions/computer/computer.py +523 -0
  9. llms/extensions/computer/edit.py +299 -0
  10. llms/extensions/computer/filesystem.py +542 -0
  11. llms/extensions/computer/platform.py +461 -0
  12. llms/extensions/computer/run.py +37 -0
  13. llms/extensions/core_tools/__init__.py +0 -38
  14. llms/extensions/providers/anthropic.py +28 -1
  15. llms/extensions/providers/cerebras.py +0 -1
  16. llms/extensions/providers/google.py +112 -34
  17. llms/extensions/skills/LICENSE +202 -0
  18. llms/extensions/skills/__init__.py +130 -0
  19. llms/extensions/skills/errors.py +25 -0
  20. llms/extensions/skills/models.py +39 -0
  21. llms/extensions/skills/parser.py +178 -0
  22. llms/extensions/skills/ui/index.mjs +376 -0
  23. llms/extensions/skills/ui/skills/create-plan/SKILL.md +74 -0
  24. llms/extensions/skills/validator.py +177 -0
  25. llms/extensions/system_prompts/ui/index.mjs +6 -10
  26. llms/extensions/tools/__init__.py +5 -82
  27. llms/extensions/tools/ui/index.mjs +194 -63
  28. llms/main.py +502 -146
  29. llms/ui/ai.mjs +1 -1
  30. llms/ui/app.css +530 -0
  31. llms/ui/ctx.mjs +53 -6
  32. llms/ui/modules/chat/ChatBody.mjs +200 -20
  33. llms/ui/modules/chat/index.mjs +108 -104
  34. llms/ui/tailwind.input.css +10 -0
  35. llms/ui/utils.mjs +25 -1
  36. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/METADATA +2 -2
  37. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/RECORD +41 -24
  38. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/WHEEL +1 -1
  39. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/entry_points.txt +0 -0
  40. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/licenses/LICENSE +0 -0
  41. {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/top_level.txt +0 -0
@@ -2,7 +2,7 @@
2
2
  import { ref, watch, computed, nextTick, inject } from 'vue'
3
3
  import { $$, createElement, lastRightPart, ApiResult, createErrorStatus } from "@servicestack/client"
4
4
  import SettingsDialog, { useSettings } from './SettingsDialog.mjs'
5
- import { ChatBody, LightboxImage, TypeText, TypeImage, TypeAudio, TypeFile, ViewType, ViewTypes, ViewToolTypes, ToolArguments, ToolOutput, MessageUsage, MessageReasoning } from './ChatBody.mjs'
5
+ import { ChatBody, LightboxImage, TypeText, TypeImage, TypeAudio, TypeFile, ViewType, ViewTypes, ViewToolTypes, TextViewer, ToolArguments, ToolOutput, MessageUsage, MessageReasoning } from './ChatBody.mjs'
6
6
  import { AppContext } from '../../ctx.mjs'
7
7
 
8
8
  const imageExts = 'png,webp,jpg,jpeg,gif,bmp,svg,tiff,ico'.split(',')
@@ -252,23 +252,14 @@ export function useChatPrompt(ctx) {
252
252
  return ctx.createErrorResult({ message: `Model ${request.model || ''} not found`, errorCode: 'NotFound' })
253
253
  }
254
254
 
255
- if (!request.messages) request.messages = []
256
- if (!request.metadata) request.metadata = {}
257
-
258
255
  if (!thread) {
259
256
  const title = getTextContent(request) || 'New Chat'
260
257
  thread = await ctx.threads.startNewThread({ title, model, redirect })
261
258
  }
262
259
 
263
- const threadId = thread?.id
264
-
265
- const ctxRequest = {
266
- request,
267
- thread,
268
- }
260
+ const ctxRequest = ctx.createChatContext({ request, thread })
269
261
  ctx.chatRequestFilters.forEach(f => f(ctxRequest))
270
-
271
- console.debug('completion.request', request)
262
+ ctx.completeChatContext(ctxRequest)
272
263
 
273
264
  // Send to API
274
265
  const startTime = Date.now()
@@ -359,6 +350,105 @@ export function useChatPrompt(ctx) {
359
350
  ctx.setState({ selectedAspectRatio })
360
351
  }
361
352
 
353
+ async function sendUserMessage(text, { model, redirect = true } = {}) {
354
+ ctx.clearError()
355
+
356
+ if (!model) {
357
+ model = getSelectedModel()
358
+ }
359
+
360
+ let content = createContent({ text, files: attachedFiles.value })
361
+
362
+ let thread
363
+
364
+ // Create thread if none exists
365
+ if (!ctx.threads.currentThread.value) {
366
+ thread = await ctx.threads.startNewThread({ model, redirect })
367
+ } else {
368
+ thread = ctx.threads.currentThread.value
369
+ }
370
+
371
+ let threadId = thread.id
372
+ let messages = thread.messages || []
373
+ if (!threadId) {
374
+ console.error('No thread ID found', thread, ctx.threads.currentThread.value)
375
+ return
376
+ }
377
+
378
+ // Handle Editing / Redo Logic
379
+ const editingMsg = editingMessage.value
380
+ if (editingMsg) {
381
+ let messageIndex = messages.findIndex(m => m.timestamp === editingMsg)
382
+ if (messageIndex == -1) {
383
+ messageIndex = messages.findLastIndex(m => m.role === 'user')
384
+ }
385
+ console.log('Editing message', editingMsg, messageIndex, messages)
386
+
387
+ if (messageIndex >= 0) {
388
+ messages[messageIndex].content = content
389
+ // Truncate messages to only include up to the edited message
390
+ messages.length = messageIndex + 1
391
+ } else {
392
+ messages.push({
393
+ timestamp: new Date().valueOf(),
394
+ role: 'user',
395
+ content,
396
+ })
397
+ }
398
+ } else {
399
+ // Regular Send Logic
400
+ const lastMessage = messages[messages.length - 1]
401
+
402
+ // Check duplicate based on text content extracted from potential array
403
+ const getLastText = (msgContent) => {
404
+ if (typeof msgContent === 'string') return msgContent
405
+ if (Array.isArray(msgContent)) return msgContent.find(c => c.type === 'text')?.text || ''
406
+ return ''
407
+ }
408
+ const newText = text // content[0].text
409
+ const lastText = lastMessage && lastMessage.role === 'user' ? getLastText(lastMessage.content) : null
410
+ const isDuplicate = lastText === newText
411
+
412
+ // Add user message only if it's not a duplicate
413
+ // Note: We are saving the FULL STRUCTURED CONTENT array here
414
+ if (!isDuplicate) {
415
+ messages.push({
416
+ timestamp: new Date().valueOf(),
417
+ role: 'user',
418
+ content,
419
+ })
420
+ }
421
+ }
422
+
423
+ const request = createRequest({ model })
424
+
425
+ // Add Thread History
426
+ messages.forEach(m => {
427
+ request.messages.push(m)
428
+ })
429
+
430
+ // Update Thread Title if not set or is default
431
+ if (!thread.title || thread.title === 'New Chat' || request.title === 'New Chat') {
432
+ request.title = text.length > 100
433
+ ? text.slice(0, 100) + '...'
434
+ : text
435
+ console.debug(`changing thread title from '${thread.title}' to '${request.title}'`)
436
+ } else {
437
+ console.debug(`thread title is '${thread.title}'`, request.title)
438
+ }
439
+
440
+ const api = await ctx.threads.queueChat({ request, thread })
441
+ if (api.response) {
442
+ // success
443
+ editingMessage.value = null
444
+ attachedFiles.value = []
445
+ thread = api.response
446
+ ctx.threads.replaceThread(thread)
447
+ } else {
448
+ ctx.setError(api.error)
449
+ }
450
+ }
451
+
362
452
  return {
363
453
  completion,
364
454
  createContent,
@@ -383,6 +473,7 @@ export function useChatPrompt(ctx) {
383
473
  getTextContent,
384
474
  getAnswer,
385
475
  selectAspectRatio,
476
+ sendUserMessage,
386
477
  }
387
478
  }
388
479
 
@@ -499,6 +590,7 @@ const ChatPrompt = {
499
590
  hasAudio,
500
591
  hasFile,
501
592
  getTextContent,
593
+ sendUserMessage,
502
594
  } = ctx.chat
503
595
 
504
596
  const fileInput = ref(null)
@@ -640,8 +732,6 @@ const ChatPrompt = {
640
732
  if (!messageText.value?.trim() && !hasImage() && !hasAudio() && !hasFile()) return
641
733
  if (ctx.threads.isWatchingThread.value || !props.model) return
642
734
 
643
- ctx.clearError()
644
-
645
735
  // 1. Construct Structured Content (Text + Attachments)
646
736
  let text = messageText.value.trim()
647
737
 
@@ -654,96 +744,8 @@ const ChatPrompt = {
654
744
  }
655
745
 
656
746
  messageText.value = ''
657
- let content = ctx.chat.createContent({ text, files: ctx.chat.attachedFiles.value })
658
-
659
- let thread
660
-
661
- // Create thread if none exists
662
- if (!ctx.threads.currentThread.value) {
663
- thread = await ctx.threads.startNewThread({ model: props.model, redirect: true })
664
- } else {
665
- thread = ctx.threads.currentThread.value
666
- }
667
-
668
- let threadId = thread.id
669
- let messages = thread.messages || []
670
- if (!threadId) {
671
- console.error('No thread ID found', thread, ctx.threads.currentThread.value)
672
- return
673
- }
674
-
675
- // Handle Editing / Redo Logic
676
- const editingMessage = ctx.chat.editingMessage.value
677
- if (editingMessage) {
678
- let messageIndex = messages.findIndex(m => m.timestamp === editingMessage)
679
- if (messageIndex == -1) {
680
- messageIndex = messages.findLastIndex(m => m.role === 'user')
681
- }
682
- console.log('Editing message', editingMessage, messageIndex, messages)
683
-
684
- if (messageIndex >= 0) {
685
- messages[messageIndex].content = content
686
- // Truncate messages to only include up to the edited message
687
- messages.length = messageIndex + 1
688
- } else {
689
- messages.push({
690
- timestamp: new Date().valueOf(),
691
- role: 'user',
692
- content,
693
- })
694
- }
695
- } else {
696
- // Regular Send Logic
697
- const lastMessage = messages[messages.length - 1]
698
-
699
- // Check duplicate based on text content extracted from potential array
700
- const getLastText = (msgContent) => {
701
- if (typeof msgContent === 'string') return msgContent
702
- if (Array.isArray(msgContent)) return msgContent.find(c => c.type === 'text')?.text || ''
703
- return ''
704
- }
705
- const newText = text // content[0].text
706
- const lastText = lastMessage && lastMessage.role === 'user' ? getLastText(lastMessage.content) : null
707
- const isDuplicate = lastText === newText
708
-
709
- // Add user message only if it's not a duplicate
710
- // Note: We are saving the FULL STRUCTURED CONTENT array here
711
- if (!isDuplicate) {
712
- messages.push({
713
- timestamp: new Date().valueOf(),
714
- role: 'user',
715
- content,
716
- })
717
- }
718
- }
719
-
720
- const request = ctx.chat.createRequest({ model: props.model })
721
747
 
722
- // Add Thread History
723
- messages.forEach(m => {
724
- request.messages.push(m)
725
- })
726
-
727
- // Update Thread Title if not set or is default
728
- if (!thread.title || thread.title === 'New Chat' || request.title === 'New Chat') {
729
- request.title = text.length > 100
730
- ? text.slice(0, 100) + '...'
731
- : text
732
- console.debug(`changing thread title from '${thread.title}' to '${request.title}'`)
733
- } else {
734
- console.debug(`thread title is '${thread.title}'`, request.title)
735
- }
736
-
737
- const api = await ctx.threads.queueChat({ request, thread })
738
- if (api.response) {
739
- // success
740
- ctx.chat.editingMessage.value = null
741
- ctx.chat.attachedFiles.value = []
742
- thread = api.response
743
- ctx.threads.replaceThread(thread)
744
- } else {
745
- ctx.setError(api.error)
746
- }
748
+ await sendUserMessage(text, { model: props.model })
747
749
 
748
750
  // Restore focus to the textarea
749
751
  nextTick(() => {
@@ -828,6 +830,7 @@ const ChatPrompt = {
828
830
  addNewLine,
829
831
  onKeyDown,
830
832
  imageAspectRatios,
833
+ sendUserMessage,
831
834
  }
832
835
  }
833
836
  }
@@ -935,6 +938,7 @@ export default {
935
938
  ViewType,
936
939
  ViewTypes,
937
940
  ViewToolTypes,
941
+ TextViewer,
938
942
  ToolArguments,
939
943
  ToolOutput,
940
944
 
@@ -950,7 +954,7 @@ export default {
950
954
  ctx.setLeftIcons({
951
955
  chat: {
952
956
  component: {
953
- template: `<svg @click="$ctx.togglePath('/')" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="currentColor" d="M8 2.19c3.13 0 5.68 2.25 5.68 5s-2.55 5-5.68 5a5.7 5.7 0 0 1-1.89-.29l-.75-.26l-.56.56a14 14 0 0 1-2 1.55a.13.13 0 0 1-.07 0v-.06a6.58 6.58 0 0 0 .15-4.29a5.25 5.25 0 0 1-.55-2.16c0-2.77 2.55-5 5.68-5M8 .94c-3.83 0-6.93 2.81-6.93 6.27a6.4 6.4 0 0 0 .64 2.64a5.53 5.53 0 0 1-.18 3.48a1.32 1.32 0 0 0 2 1.5a15 15 0 0 0 2.16-1.71a6.8 6.8 0 0 0 2.31.36c3.83 0 6.93-2.81 6.93-6.27S11.83.94 8 .94"/><ellipse cx="5.2" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="10.8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/></svg>`,
957
+ template: `<svg @click="$ctx.togglePath($ctx.layout.path?.startsWith('/c/') ? $ctx.layout.path : '/')" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="currentColor" d="M8 2.19c3.13 0 5.68 2.25 5.68 5s-2.55 5-5.68 5a5.7 5.7 0 0 1-1.89-.29l-.75-.26l-.56.56a14 14 0 0 1-2 1.55a.13.13 0 0 1-.07 0v-.06a6.58 6.58 0 0 0 .15-4.29a5.25 5.25 0 0 1-.55-2.16c0-2.77 2.55-5 5.68-5M8 .94c-3.83 0-6.93 2.81-6.93 6.27a6.4 6.4 0 0 0 .64 2.64a5.53 5.53 0 0 1-.18 3.48a1.32 1.32 0 0 0 2 1.5a15 15 0 0 0 2.16-1.71a6.8 6.8 0 0 0 2.31.36c3.83 0 6.93-2.81 6.93-6.27S11.83.94 8 .94"/><ellipse cx="5.2" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="10.8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/></svg>`,
954
958
  },
955
959
  isActive({ path }) {
956
960
  return path === '/' || path.startsWith('/c/')
@@ -166,6 +166,16 @@
166
166
  overflow: auto !important;
167
167
  }
168
168
 
169
+ .prose .frontmatter {
170
+ white-space: pre-wrap;
171
+ word-break: break-all;
172
+ margin-bottom: 1em;
173
+ padding: 0.5rem;
174
+ font-size: 0.8rem !important;
175
+ background: #f9fafb;
176
+ border: 1px solid #e5e7eb;
177
+ }
178
+
169
179
  /* highlight.js - vs.css */
170
180
  .hljs {
171
181
  background: white;
llms/ui/utils.mjs CHANGED
@@ -211,6 +211,19 @@ export function isHtml(s) {
211
211
  return isHtml
212
212
  }
213
213
 
214
+ const htmlEntities = {
215
+ '&': '&amp;',
216
+ '<': '&lt;',
217
+ '>': '&gt;',
218
+ '"': '&quot;',
219
+ "'": '&#39;'
220
+ }
221
+
222
+ export function encodeHtml(str) {
223
+ if (!str) return ''
224
+ return str.replace(/[&<>"']/g, m => htmlEntities[m]);
225
+ }
226
+
214
227
  /**
215
228
  * @param {object|array} type
216
229
  * @param {'div'|'table'|'thead'|'th'|'tr'|'td'} tag
@@ -241,6 +254,16 @@ export const nextId = (() => {
241
254
  }
242
255
  })();
243
256
 
257
+ export function fnv1a(str) {
258
+ let hash = 0x811c9dc5
259
+ for (let i = 0; i < str.length; i++) {
260
+ hash ^= str.charCodeAt(i)
261
+ hash = Math.imul(hash, 0x01000193)
262
+ }
263
+ return hash >>> 0
264
+ }
265
+ export const hashString = fnv1a
266
+
244
267
  export function utilsFunctions() {
245
268
  return {
246
269
  nextId,
@@ -256,6 +279,7 @@ export function utilsFunctions() {
256
279
  pluralize,
257
280
  isHtml,
258
281
  htmlFormatClasses,
282
+ encodeHtml,
283
+ hashString,
259
284
  }
260
285
  }
261
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.10
3
+ Version: 3.0.18
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
@@ -44,6 +44,6 @@ Lightweight CLI, API and ChatGPT-like alternative to Open WebUI for accessing mu
44
44
 
45
45
  [llmspy.org](https://llmspy.org)
46
46
 
47
- [![](https://github.com/ServiceStack/llmspy.org/blob/main/public/img/llmspy-home.webp?raw=true)](https://llmspy.org)
47
+ [![](https://github.com/ServiceStack/llmspy.org/blob/main/public/img/llmspy-home-v3.webp?raw=true)](https://llmspy.org)
48
48
 
49
49
  GitHub: [llmspy.org](https://github.com/ServiceStack/llmspy.org)
@@ -3,18 +3,27 @@ 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=ZSRfpbTGMJjU_H65Iz4I6aDBmEQjFnfUwSGRr4SJfQg,169748
6
+ llms/main.py,sha256=OEIYwv6u6bFh9D3Woa0kinkPiPek7Zu9CAPQv62qrUQ,183589
7
7
  llms/providers-extra.json,sha256=_6DmGBiQY9LM6_Y0zOiObYn7ba4g3akSNQfmHcYlENc,11101
8
8
  llms/providers.json,sha256=yjhDurlwo70xqfV0HNLiZaCpw3WvtIgkjoLahQIKX2w,282530
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=aU8Bfliw--Xj1bsKL3PSoX6MY1ZNgweNyMWS1V_YG4s,20855
12
- llms/extensions/app/db.py,sha256=CqpHReXXjrLXXNxINo-wsnBJenKZVVHKlWlhtXFWj08,21503
11
+ llms/extensions/app/__init__.py,sha256=5TX1QZ0c4CpTpZQvoBebNLfBToTP_Sdi2tiCvbwFMd4,20799
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
15
- llms/extensions/app/ui/threadStore.mjs,sha256=CLlD-1HBO1yhZBHLfL0ZdA4quT4R07qr1JW4a8igVNc,12287
15
+ llms/extensions/app/ui/threadStore.mjs,sha256=QS6mLqysw9Je_ixUKpbhAELGq-As8aFk6Qm_vO5hvUQ,12515
16
+ llms/extensions/computer/README.md,sha256=xGQXMFtTnjOLll9rDeF1b6Msl3uK5UwjvocvW7WCmps,4293
17
+ llms/extensions/computer/__init__.py,sha256=47nBZI4VMAJ0-mU0QCNtiqKRd-0CF9z8BnBsLE1jrQw,1813
18
+ llms/extensions/computer/base.py,sha256=Igio5R6kPQOxIbmpaA7X6j6eC4cpF3jwTTR8rURfp5E,2386
19
+ llms/extensions/computer/bash.py,sha256=-xo67wVAdrqxtXgR7MK-iAkJ4Wne7Dm1JmnuHC2xW8o,5953
20
+ llms/extensions/computer/computer.py,sha256=wehwcrYwi9usCRcziE_loMhWDbVgfjLk_T4_4TZa4W4,19642
21
+ llms/extensions/computer/edit.py,sha256=QluhvRhYSSQJfbih4QyfC4M8W8aVqiOApfYXZgZTI5M,12725
22
+ llms/extensions/computer/filesystem.py,sha256=4k_aq-wDySz1yV7k3ZshKr5q8LGH8gYkXgGDNAr62lc,19703
23
+ llms/extensions/computer/platform.py,sha256=w5ECar8lM4Lag7rTYUQmU7wEWaqCeejNXwwM3CB8ulQ,14866
24
+ llms/extensions/computer/run.py,sha256=ZIcoYyy2cc3IKR_T4yJgx6IUHu2m7UusIJi9Dx1s7dA,1566
16
25
  llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
17
- llms/extensions/core_tools/__init__.py,sha256=Y5ZlcSg5yVXxIGX_FVbDcHyeXx3ex_rzRQ2hli6Nk38,23280
26
+ llms/extensions/core_tools/__init__.py,sha256=w8ovJRgXsvrcL8NF-XOrhuBE1oQXfnSQo-Xu7ww3NQY,21641
18
27
  llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
19
28
  llms/extensions/core_tools/ui/codemirror/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
20
29
  llms/extensions/core_tools/ui/codemirror/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
@@ -128,30 +137,38 @@ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf,sha256=8B8-h9nGphwMC
128
137
  llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fWv1YRLXQMhsiNR_rxyDg3ouHI1J2Cfc,16028
129
138
  llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
130
139
  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
140
+ llms/extensions/providers/anthropic.py,sha256=ey3G9D3drhjzaNTKC8SS_XVSjdi3K7uqYTskmf26Aic,12011
141
+ llms/extensions/providers/cerebras.py,sha256=iKPzsaRIBqQWXsgPQ50jsNPGx8Ud704VVUAXzDBHu7k,1368
133
142
  llms/extensions/providers/chutes.py,sha256=5ZrfbqoOhgzKLQy_qULcp4jlvW5WXPR0jP9kN2Jzb9g,6229
134
- llms/extensions/providers/google.py,sha256=9P90bEefRA18tpjfEuAz1T5YpwzdOngrTFhw-LI3eXg,24434
143
+ llms/extensions/providers/google.py,sha256=rRmpmtSjTM04mZGNyEV2jcDxdDM99GNj_X68dNT1H20,27719
135
144
  llms/extensions/providers/nvidia.py,sha256=C6cwqn3EufYDfRIgbc8MDkQNyD6w3c7hbjfYaHJSDik,4279
136
145
  llms/extensions/providers/openai.py,sha256=hkE-LVsw6M92_qEbpayuPo17Z1OWKHe7lm2wduLMng8,6138
137
146
  llms/extensions/providers/openrouter.py,sha256=5SfCJKo1aGKoDGez6HXYQe9elMMo9sSEDFqqdxamAgA,3330
138
147
  llms/extensions/providers/zai.py,sha256=WPJlDxmnjuhxlgWhUXw2MYqgEKYfy14wVQbpQyMMlbU,7736
148
+ llms/extensions/skills/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
149
+ llms/extensions/skills/__init__.py,sha256=hnbcXTc578zwxJjY3qq56UZtd-cqqVoNHxHLziOBKw4,4352
150
+ llms/extensions/skills/errors.py,sha256=V4DTFNtzVADDlZ0g7RmoxZRFeG01oaG3zzaPAVdtkfQ,572
151
+ llms/extensions/skills/models.py,sha256=xmRfz8BMeOdzZXhW6MYFjkOVHOKD6bMDynId8aysans,1461
152
+ llms/extensions/skills/parser.py,sha256=Mb4NOtoY3Ip4Nng8ixb26oE8U_Sp5CI3n3l_qxbg1UM,5500
153
+ llms/extensions/skills/validator.py,sha256=te49hTfIPJWcMcLLCApSJ2Ru3lrqVF8ayDXtPEZF9sU,5154
154
+ llms/extensions/skills/ui/index.mjs,sha256=E_AVSvsnLDlbHFXnSYoOuXRlfrhrW7ZZ_Kzj6KbqQD0,18240
155
+ llms/extensions/skills/ui/skills/create-plan/SKILL.md,sha256=g_SLyBid2dwj56FBzh87lZGu1t08edLs0plimT2uNzs,2481
139
156
  llms/extensions/system_prompts/README.md,sha256=ayr18lnSsGp62bunC6kxkvcSvZki775rbZ-8VoMDQEc,597
140
157
  llms/extensions/system_prompts/__init__.py,sha256=TZy1CS2dPkBNBA_Ovf9BlVetZqTt2NgnsrZi6Mtg_C0,1535
141
- llms/extensions/system_prompts/ui/index.mjs,sha256=_pVCreAebSzE9dzcHF2kiYODwP-fDHCqtUQB-X5Io9Q,12107
158
+ llms/extensions/system_prompts/ui/index.mjs,sha256=Ec2dXSzEj6RnEuW2U3HxeXK3LTl_lJrVJIayozquoB4,11981
142
159
  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
160
+ llms/extensions/tools/__init__.py,sha256=PRZe0QMfsOymJ3jTqO0VFppNEWI4f2bYSOImK_YrGQM,2036
161
+ llms/extensions/tools/ui/index.mjs,sha256=1TgCn74oX_rUAhxO8w54HlIgNkHnI5ma-GCqXp-qYVY,39434
145
162
  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
163
+ llms/ui/ai.mjs,sha256=ygL0iKBWY8eix4oFJdtS1eHdJ3qfCRwP0K5UHFjoTKI,6541
164
+ llms/ui/app.css,sha256=kKKICFM_85H1BDFdUYJzo93S__1OZcj2cO6zL-4VdJs,209085
165
+ llms/ui/ctx.mjs,sha256=g1mmv87bhKCFyMbAImvX6mArmGliAoGPPupFEaMMf7c,14500
149
166
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
150
167
  llms/ui/index.mjs,sha256=7GMbFyG3L4k6dxSrQYQ0BLzqL976xw5HeaqKco0THHA,4296
151
168
  llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
152
- llms/ui/tailwind.input.css,sha256=xOrT0m8HCZRHhnPv4K43HyQCTO_0SpP-tYvxpP8jzYY,17027
169
+ llms/ui/tailwind.input.css,sha256=9stg-po5X2-y598_Qw_2rnfRXR2NPjZK--d9xf-tZZE,17277
153
170
  llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
154
- llms/ui/utils.mjs,sha256=lurZdnTk4ngR7ziWKeUNvpWVmBg2V6phqngBYWcCL5U,7483
171
+ llms/ui/utils.mjs,sha256=mYLTe5-CncWos4Y4z-hzvXVESKkTuVHDYTRMRGc6Ssc,7993
155
172
  llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
156
173
  llms/ui/lib/charts.mjs,sha256=OPFAifcA4MPRv8pw6I7glVh7Xccv8guio0k35zPBDIY,926
157
174
  llms/ui/lib/color.js,sha256=DDG7Pr-qzJHTPISZNSqP_qJR8UflKHEc_56n6xrBugQ,8273
@@ -166,12 +183,12 @@ llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
166
183
  llms/ui/modules/icons.mjs,sha256=LGcH0ys0QLS2ZKCO42qHpwPYbBV_EssoWLezU4XZEzU,27751
167
184
  llms/ui/modules/layout.mjs,sha256=8pAxs8bedQI3b3eRA9nrfpLZznLmrpp4BZvigYAQjpQ,12572
168
185
  llms/ui/modules/model-selector.mjs,sha256=6U4rAZ7vmQELFRQGWk4YEtq02v3lyHdMq6yUOp-ArXg,43184
169
- llms/ui/modules/chat/ChatBody.mjs,sha256=5yWjo6tWmcKidDpRvKFeHqx3lXO3DB-3rTyXY72gB4U,49122
186
+ llms/ui/modules/chat/ChatBody.mjs,sha256=Rwyr7JeqBn6LUn-VtHB9qj7kBsLsOr34SbHcK0twIZ0,58118
170
187
  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,,
188
+ llms/ui/modules/chat/index.mjs,sha256=nS_L6G1RSuCybgnA6n-q8Sn3OeSbQWL2iW3-zCIFqJk,39548
189
+ llms_py-3.0.18.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
190
+ llms_py-3.0.18.dist-info/METADATA,sha256=YHJKCwkqHfcJ3EiZwPSGQhytS-fZs1oTId8_Lw340os,2195
191
+ llms_py-3.0.18.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
192
+ llms_py-3.0.18.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
193
+ llms_py-3.0.18.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
194
+ llms_py-3.0.18.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.9.0)
2
+ Generator: setuptools (80.10.2)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5