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.
- llms/extensions/app/__init__.py +0 -1
- llms/extensions/app/db.py +7 -3
- llms/extensions/app/ui/threadStore.mjs +10 -3
- llms/extensions/computer/README.md +96 -0
- llms/extensions/computer/__init__.py +59 -0
- llms/extensions/computer/base.py +80 -0
- llms/extensions/computer/bash.py +185 -0
- llms/extensions/computer/computer.py +523 -0
- llms/extensions/computer/edit.py +299 -0
- llms/extensions/computer/filesystem.py +542 -0
- llms/extensions/computer/platform.py +461 -0
- llms/extensions/computer/run.py +37 -0
- llms/extensions/core_tools/__init__.py +0 -38
- llms/extensions/providers/anthropic.py +28 -1
- llms/extensions/providers/cerebras.py +0 -1
- llms/extensions/providers/google.py +112 -34
- llms/extensions/skills/LICENSE +202 -0
- llms/extensions/skills/__init__.py +130 -0
- llms/extensions/skills/errors.py +25 -0
- llms/extensions/skills/models.py +39 -0
- llms/extensions/skills/parser.py +178 -0
- llms/extensions/skills/ui/index.mjs +376 -0
- llms/extensions/skills/ui/skills/create-plan/SKILL.md +74 -0
- llms/extensions/skills/validator.py +177 -0
- llms/extensions/system_prompts/ui/index.mjs +6 -10
- llms/extensions/tools/__init__.py +5 -82
- llms/extensions/tools/ui/index.mjs +194 -63
- llms/main.py +502 -146
- llms/ui/ai.mjs +1 -1
- llms/ui/app.css +530 -0
- llms/ui/ctx.mjs +53 -6
- llms/ui/modules/chat/ChatBody.mjs +200 -20
- llms/ui/modules/chat/index.mjs +108 -104
- llms/ui/tailwind.input.css +10 -0
- llms/ui/utils.mjs +25 -1
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/METADATA +2 -2
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/RECORD +41 -24
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/WHEEL +1 -1
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/entry_points.txt +0 -0
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/licenses/LICENSE +0 -0
- {llms_py-3.0.10.dist-info → llms_py-3.0.18.dist-info}/top_level.txt +0 -0
llms/ui/modules/chat/index.mjs
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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/')
|
llms/ui/tailwind.input.css
CHANGED
|
@@ -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
|
+
'&': '&',
|
|
216
|
+
'<': '<',
|
|
217
|
+
'>': '>',
|
|
218
|
+
'"': '"',
|
|
219
|
+
"'": '''
|
|
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.
|
|
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://llmspy.org)
|
|
47
|
+
[](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=
|
|
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=
|
|
12
|
-
llms/extensions/app/db.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
132
|
-
llms/extensions/providers/cerebras.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
144
|
-
llms/extensions/tools/ui/index.mjs,sha256=
|
|
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=
|
|
147
|
-
llms/ui/app.css,sha256=
|
|
148
|
-
llms/ui/ctx.mjs,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
172
|
-
llms_py-3.0.
|
|
173
|
-
llms_py-3.0.
|
|
174
|
-
llms_py-3.0.
|
|
175
|
-
llms_py-3.0.
|
|
176
|
-
llms_py-3.0.
|
|
177
|
-
llms_py-3.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|