llms-py 3.0.0b9__py3-none-any.whl → 3.0.1__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 (58) hide show
  1. llms/extensions/app/README.md +20 -0
  2. llms/extensions/app/__init__.py +16 -15
  3. llms/extensions/app/db.py +7 -6
  4. llms/extensions/app/ui/index.mjs +1 -1
  5. llms/extensions/app/ui/threadStore.mjs +21 -17
  6. llms/extensions/core_tools/CALCULATOR.md +32 -0
  7. llms/extensions/core_tools/__init__.py +1 -1
  8. llms/extensions/core_tools/ui/index.mjs +4 -4
  9. llms/extensions/gallery/README.md +61 -0
  10. llms/extensions/gallery/ui/index.mjs +1 -0
  11. llms/extensions/katex/README.md +39 -0
  12. llms/extensions/system_prompts/README.md +22 -0
  13. llms/extensions/system_prompts/ui/index.mjs +21 -26
  14. llms/extensions/system_prompts/ui/prompts.json +5 -5
  15. llms/llms.json +9 -12
  16. llms/main.py +25 -5
  17. llms/providers.json +1 -1
  18. llms/ui/ai.mjs +20 -5
  19. llms/ui/ctx.mjs +25 -1
  20. llms/ui/modules/chat/ChatBody.mjs +43 -27
  21. llms/ui/modules/chat/index.mjs +17 -29
  22. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/METADATA +1 -1
  23. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/RECORD +27 -53
  24. llms/__pycache__/__init__.cpython-312.pyc +0 -0
  25. llms/__pycache__/__init__.cpython-313.pyc +0 -0
  26. llms/__pycache__/__init__.cpython-314.pyc +0 -0
  27. llms/__pycache__/__main__.cpython-312.pyc +0 -0
  28. llms/__pycache__/__main__.cpython-314.pyc +0 -0
  29. llms/__pycache__/llms.cpython-312.pyc +0 -0
  30. llms/__pycache__/main.cpython-312.pyc +0 -0
  31. llms/__pycache__/main.cpython-313.pyc +0 -0
  32. llms/__pycache__/main.cpython-314.pyc +0 -0
  33. llms/__pycache__/plugins.cpython-314.pyc +0 -0
  34. llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
  35. llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
  36. llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
  37. llms/extensions/app/requests.json +0 -9073
  38. llms/extensions/app/threads.json +0 -15290
  39. llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
  40. llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +0 -344
  41. llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +0 -9884
  42. llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc +0 -0
  43. llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
  44. llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
  45. llms/extensions/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  46. llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  47. llms/extensions/providers/__pycache__/chutes.cpython-314.pyc +0 -0
  48. llms/extensions/providers/__pycache__/google.cpython-314.pyc +0 -0
  49. llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc +0 -0
  50. llms/extensions/providers/__pycache__/openai.cpython-314.pyc +0 -0
  51. llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
  52. llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc +0 -0
  53. llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  54. llms/ui/modules/chat/HomeTools.mjs +0 -12
  55. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/WHEEL +0 -0
  56. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/entry_points.txt +0 -0
  57. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/licenses/LICENSE +0 -0
  58. {llms_py-3.0.0b9.dist-info → llms_py-3.0.1.dist-info}/top_level.txt +0 -0
llms/ui/ai.mjs CHANGED
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '3.0.0b9',
9
+ version: '3.0.1',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -74,12 +74,27 @@ export const o = {
74
74
  return { responseStatus }
75
75
  }
76
76
  },
77
+ createErrorStatus({ message, errorCode, stackTrace, errors, meta }) {
78
+ const ret = {
79
+ errorCode: errorCode || 'Error',
80
+ message: message,
81
+ }
82
+ if (stackTrace) {
83
+ ret.stackTrace = stackTrace
84
+ }
85
+ if (errors && Array.isArray(errors)) {
86
+ ret.errors = errors
87
+ }
88
+ if (meta) {
89
+ ret.meta = meta
90
+ }
91
+ return ret
92
+ },
77
93
  createErrorResult(e) {
78
94
  return new ApiResult({
79
- responseStatus: {
80
- errorCode: 'Error',
81
- message: `${e.message ?? e}`
82
- }
95
+ error: e.errorCode
96
+ ? this.createErrorStatus(e)
97
+ : this.createErrorStatus({ message: `${e.message ?? e}` })
83
98
  })
84
99
  },
85
100
  async getConfig() {
llms/ui/ctx.mjs CHANGED
@@ -22,6 +22,9 @@ export class ExtensionScope {
22
22
  savePrefs() {
23
23
  storageObject(this.storageKey, this.prefs)
24
24
  }
25
+ setState(o) {
26
+ Object.assign(this.state, o)
27
+ }
25
28
  get(url, options) {
26
29
  return this.ctx.ai.get(combinePaths(this.baseUrl, url), options)
27
30
  }
@@ -43,6 +46,18 @@ export class ExtensionScope {
43
46
  post(url, options) {
44
47
  return this.ctx.ai.post(combinePaths(this.baseUrl, url), options)
45
48
  }
49
+ put(url, options) {
50
+ return this.ctx.ai.post(combinePaths(this.baseUrl, url), {
51
+ ...options,
52
+ method: 'PUT'
53
+ })
54
+ }
55
+ patch(url, options) {
56
+ return this.ctx.ai.post(combinePaths(this.baseUrl, url), {
57
+ ...options,
58
+ method: 'PATCH'
59
+ })
60
+ }
46
61
  async postForm(url, options) {
47
62
  return await this.ctx.ai.postForm(combinePaths(this.baseUrl, url), options)
48
63
  }
@@ -66,6 +81,9 @@ export class ExtensionScope {
66
81
  async createJsonResult(res) {
67
82
  return this.ctx.ai.createJsonResult(res)
68
83
  }
84
+ createErrorStatus(status) {
85
+ return this.ctx.ai.createErrorStatus(status)
86
+ }
69
87
  createErrorResult(e) {
70
88
  return this.ctx.ai.createErrorResult(e)
71
89
  }
@@ -217,7 +235,6 @@ export class AppContext {
217
235
  }
218
236
  setState(o) {
219
237
  Object.assign(this.state, o)
220
- //this.events.publish('update:state', this.state)
221
238
  }
222
239
  setLayout(o) {
223
240
  Object.assign(this.layout, o)
@@ -263,6 +280,12 @@ export class AppContext {
263
280
  return toggle
264
281
  }
265
282
 
283
+ createErrorStatus(status) {
284
+ return this.ai.createErrorStatus(status)
285
+ }
286
+ createErrorResult(e) {
287
+ return this.ai.createErrorResult(e)
288
+ }
266
289
  setError(error, msg = null) {
267
290
  this.state.error = error
268
291
  if (error) {
@@ -331,6 +354,7 @@ export class AppContext {
331
354
  if (Array.isArray(content)) {
332
355
  content = content.filter(c => c.type === 'text').map(c => c.text).join('\n')
333
356
  }
357
+ // Handled by katex
334
358
  // if (content) {
335
359
  // content = content
336
360
  // .replaceAll(`\\[ \\boxed{`, '\n<span class="inline-block text-xl text-blue-500 bg-blue-50 dark:text-blue-400 dark:bg-blue-950 px-3 py-1 rounded">')
@@ -20,9 +20,50 @@ const MessageUsage = {
20
20
  }
21
21
  }
22
22
 
23
+ const MessageReasoning = {
24
+ template: `
25
+ <div class="mt-2 mb-2">
26
+ <button type="button" @click="toggleReasoning(message.id)" class="text-xs text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 flex items-center space-x-1">
27
+ <svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" :class="isReasoningExpanded(message.id) ? 'transform rotate-90' : ''"><path fill="currentColor" d="M7 5l6 5l-6 5z"/></svg>
28
+ <span>{{ isReasoningExpanded(message.id) ? 'Hide reasoning' : 'Show reasoning' }}</span>
29
+ </button>
30
+ <div v-if="isReasoningExpanded(message.id)" class="reasoning mt-2 rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 p-2">
31
+ <div v-if="typeof reasoning === 'string'" v-html="$fmt.markdown(reasoning)" class="prose prose-xs max-w-none dark:prose-invert"></div>
32
+ <pre v-else class="text-xs whitespace-pre-wrap overflow-x-auto">{{ formatReasoning(reasoning) }}</pre>
33
+ </div>
34
+ </div>
35
+ `,
36
+ props: {
37
+ reasoning: String,
38
+ message: Object,
39
+ },
40
+ setup(props) {
41
+ const expandedReasoning = ref(new Set())
42
+ const isReasoningExpanded = (id) => expandedReasoning.value.has(id)
43
+ const toggleReasoning = (id) => {
44
+ const s = new Set(expandedReasoning.value)
45
+ if (s.has(id)) {
46
+ s.delete(id)
47
+ } else {
48
+ s.add(id)
49
+ }
50
+ expandedReasoning.value = s
51
+ }
52
+ const formatReasoning = (r) => typeof r === 'string' ? r : JSON.stringify(r, null, 2)
53
+
54
+ return {
55
+ expandedReasoning,
56
+ isReasoningExpanded,
57
+ toggleReasoning,
58
+ formatReasoning,
59
+ }
60
+ }
61
+ }
62
+
23
63
  export default {
24
64
  components: {
25
65
  MessageUsage,
66
+ MessageReasoning,
26
67
  },
27
68
  template: `
28
69
  <div class="flex flex-col h-full">
@@ -110,16 +151,8 @@ export default {
110
151
  ></div>
111
152
 
112
153
  <!-- Collapsible reasoning section -->
113
- <div v-if="message.role === 'assistant' && message.reasoning" class="mt-2 mb-2">
114
- <button type="button" @click="toggleReasoning(message.id)" class="text-xs text-gray-600 dark:text-gray-400 hover:text-gray-800 dark:hover:text-gray-200 flex items-center space-x-1">
115
- <svg class="w-3 h-3" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" :class="isReasoningExpanded(message.id) ? 'transform rotate-90' : ''"><path fill="currentColor" d="M7 5l6 5l-6 5z"/></svg>
116
- <span>{{ isReasoningExpanded(message.id) ? 'Hide reasoning' : 'Show reasoning' }}</span>
117
- </button>
118
- <div v-if="isReasoningExpanded(message.id)" class="reasoning mt-2 rounded-lg border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-900 p-2">
119
- <div v-if="typeof message.reasoning === 'string'" v-html="$fmt.markdown(message.reasoning)" class="prose prose-xs max-w-none dark:prose-invert"></div>
120
- <pre v-else class="text-xs whitespace-pre-wrap overflow-x-auto">{{ formatReasoning(message.reasoning) }}</pre>
121
- </div>
122
- </div>
154
+ <MessageReasoning v-if="message.role === 'assistant' && (message.reasoning || message.thinking || message.reasoning_content)"
155
+ :reasoning="message.reasoning || message.thinking || message.reasoning_content" :message="message" />
123
156
 
124
157
  <!-- Tool Calls & Outputs -->
125
158
  <div v-if="message.tool_calls && message.tool_calls.length > 0" class="mb-3 space-y-4">
@@ -435,20 +468,6 @@ export default {
435
468
  }
436
469
  }
437
470
 
438
- // Reasoning collapse state and helpers
439
- const expandedReasoning = ref(new Set())
440
- const isReasoningExpanded = (id) => expandedReasoning.value.has(id)
441
- const toggleReasoning = (id) => {
442
- const s = new Set(expandedReasoning.value)
443
- if (s.has(id)) {
444
- s.delete(id)
445
- } else {
446
- s.add(id)
447
- }
448
- expandedReasoning.value = s
449
- }
450
- const formatReasoning = (r) => typeof r === 'string' ? r : JSON.stringify(r, null, 2)
451
-
452
471
  const copyMessageContent = async (message) => {
453
472
  let content = ''
454
473
  if (Array.isArray(message.content)) {
@@ -651,9 +670,6 @@ export default {
651
670
  selectedModelObj,
652
671
  messagesContainer,
653
672
  copying,
654
- isReasoningExpanded,
655
- toggleReasoning,
656
- formatReasoning,
657
673
  copyMessageContent,
658
674
  redoMessage,
659
675
  editMessage,
@@ -1,10 +1,8 @@
1
1
 
2
- import { ref, computed, watch, nextTick, inject } from 'vue'
3
- import { useRouter } from 'vue-router'
2
+ import { ref, watch, nextTick, inject } from 'vue'
4
3
  import { $$, createElement, lastRightPart, ApiResult, createErrorStatus, pick } from "@servicestack/client"
5
4
  import SettingsDialog, { useSettings } from './SettingsDialog.mjs'
6
5
  import ChatBody from './ChatBody.mjs'
7
- import HomeTools from './HomeTools.mjs'
8
6
  import { AppContext } from '../../ctx.mjs'
9
7
 
10
8
  const imageExts = 'png,webp,jpg,jpeg,gif,bmp,svg,tiff,ico'.split(',')
@@ -238,7 +236,7 @@ export function useChatPrompt(ctx) {
238
236
  return request
239
237
  }
240
238
 
241
- async function completion({ request, model, thread, controller, store }) {
239
+ async function completion({ request, thread, model, controller, redirect }) {
242
240
  try {
243
241
  let error
244
242
  if (!model) {
@@ -250,20 +248,18 @@ export function useChatPrompt(ctx) {
250
248
  }
251
249
 
252
250
  if (!model) {
253
- return new ApiResult({
254
- error: createErrorStatus(`Model ${request.model || ''} not found`, 'NotFound')
255
- })
251
+ return ctx.createErrorResult({ message: `Model ${request.model || ''} not found`, errorCode: 'NotFound' })
256
252
  }
257
253
 
258
254
  if (!request.messages) request.messages = []
259
255
  if (!request.metadata) request.metadata = {}
260
256
 
261
- if (store && !thread) {
257
+ if (!thread) {
262
258
  const title = getTextContent(request) || 'New Chat'
263
- thread = await ctx.threads.startNewThread({ title, model })
259
+ thread = await ctx.threads.startNewThread({ title, model, redirect })
264
260
  }
265
261
 
266
- const threadId = thread?.id || ctx.threads.generateThreadId()
262
+ const threadId = thread?.id
267
263
 
268
264
  const ctxRequest = {
269
265
  request,
@@ -282,7 +278,7 @@ export function useChatPrompt(ctx) {
282
278
 
283
279
  let response = null
284
280
  if (!res.ok) {
285
- error = createErrorStatus('', `HTTP ${res.status} ${res.statusText}`)
281
+ error = ctx.createErrorStatus({ message: `HTTP ${res.status} ${res.statusText}` })
286
282
  let errorBody = null
287
283
  try {
288
284
  errorBody = await res.text()
@@ -338,22 +334,6 @@ export function useChatPrompt(ctx) {
338
334
  }
339
335
  }
340
336
 
341
- // Add assistant response (save entire message including reasoning)
342
- const assistantMessage = response.choices?.[0]?.message
343
-
344
- const usage = response.usage
345
- if (usage) {
346
- if (response.metadata?.pricing) {
347
- const [input, output] = response.metadata.pricing.split('/')
348
- usage.duration = response.metadata.duration ?? (Date.now() - startTime)
349
- usage.input = input
350
- usage.output = output
351
- usage.tokens = usage.completion_tokens
352
- usage.price = usage.output
353
- usage.cost = ctx.fmt.tokenCost(usage.prompt_tokens / 1_000_000 * parseFloat(input) + usage.completion_tokens / 1_000_000 * parseFloat(output))
354
- }
355
- }
356
-
357
337
  nextTick(addCopyButtons)
358
338
 
359
339
  return new ApiResult({ response })
@@ -666,7 +646,7 @@ const ChatPrompt = {
666
646
 
667
647
  // Create thread if none exists
668
648
  if (!ctx.threads.currentThread.value) {
669
- thread = await ctx.threads.startNewThread({ model: props.model })
649
+ thread = await ctx.threads.startNewThread({ model: props.model, redirect: true })
670
650
  } else {
671
651
  thread = ctx.threads.currentThread.value
672
652
  }
@@ -740,7 +720,7 @@ const ChatPrompt = {
740
720
  console.debug(`thread title is '${thread.title}'`, request.title)
741
721
  }
742
722
 
743
- const api = await ctx.threads.queueChat(threadId, request)
723
+ const api = await ctx.threads.queueChat({ request, thread })
744
724
  if (api.response) {
745
725
  // success
746
726
  ctx.chat.editingMessage.value = null
@@ -794,6 +774,14 @@ const ChatPrompt = {
794
774
  }
795
775
  }
796
776
 
777
+ const HomeTools = {
778
+ template: `
779
+ <div class="mt-4 flex space-x-3 justify-center items-center">
780
+ <DarkModeToggle />
781
+ </div>
782
+ `,
783
+ }
784
+
797
785
  export default {
798
786
  /**@param {AppContext} ctx */
799
787
  install(ctx) {
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.0b9
3
+ Version: 3.0.1
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
@@ -1,35 +1,21 @@
1
1
  llms/__init__.py,sha256=DKwTZDsyYL_wHe7yvLw49Nf8PSgPSyWaeVdotUqSvrQ,84
2
2
  llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
3
  llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
4
- llms/llms.json,sha256=tONG9JJsEXSRaXp-L_q9ds-_5mnL9O4u1MJaqEoIXGo,11136
5
- llms/main.py,sha256=zIL-glIwhKF2goitx9tdZTNd-yP0Fn4b82D9vwfU1CQ,153533
4
+ llms/llms.json,sha256=sgHUcE6iu-MOIoEbs8ZOH1O07ziXP58UUGnEILeeAxg,11086
5
+ llms/main.py,sha256=G08w-96rZ4Y9hXA0Kwsgg86XeoKICC34JmMtAJs-fvg,154259
6
6
  llms/providers-extra.json,sha256=w7_5gB0YUPK0PJNeViM7vRDfNGChXUKMHfGHenVxEkM,10165
7
- llms/providers.json,sha256=mP4vQ37LeRAZCpT3WPO2GZaZ3YsXodXBV5OVbVMBAmo,256222
8
- llms/__pycache__/__init__.cpython-312.pyc,sha256=lg2oFc0aKgj536NOJxcIpbCpEWi47ptF8NufPphgUUk,204
9
- llms/__pycache__/__init__.cpython-313.pyc,sha256=DvmykIYAjV4Xjv5NeC70BA0JIX8qtwEWP2dfzmOBrps,173
10
- llms/__pycache__/__init__.cpython-314.pyc,sha256=9CxeBz41D_-ezno6pIOsnoMAFzdRX2uZjKkBLUm25RQ,206
11
- llms/__pycache__/__main__.cpython-312.pyc,sha256=fcu9LVl5nfdSzg9HqoKyDGoDvENeIXKkjygN7FENEGE,321
12
- llms/__pycache__/__main__.cpython-314.pyc,sha256=IFxtGVpJq_3whKuM5Ln7YMweKFNbHVp8M7VSrLK5h2A,324
13
- llms/__pycache__/llms.cpython-312.pyc,sha256=S5dFI79JdUe2dQW4ogdB-CCNhudQeFaFGcfKxgJGBms,72080
14
- llms/__pycache__/main.cpython-312.pyc,sha256=HrqApYAiiBmYN73HIx_Hl2-Xm1Gy7I_0zuR5j86qoRM,104940
15
- llms/__pycache__/main.cpython-313.pyc,sha256=6NQ__SJ2rC9ItFLKLHL5ewb5RqxLzZabwgczA9wZd-w,74814
16
- llms/__pycache__/main.cpython-314.pyc,sha256=f-kRvP_ai0SidMk2j9L3JgvjvxLLrRcy1OoKH2PToWY,198508
17
- llms/__pycache__/plugins.cpython-314.pyc,sha256=fer8nTkidG_vQSx80tL2bAvMS0opDom93bewjseFcyg,3560
7
+ llms/providers.json,sha256=5pxk0HRgyKQkW_EmA9LjSC3zqNfVo0h-qYg--i0Fy1Y,283185
18
8
  llms/extensions/analytics/ui/index.mjs,sha256=cr9dPmEJjha2xX6A_7xbJxkOolWFP1p6TgIoO8M8juI,69540
19
- llms/extensions/app/__init__.py,sha256=X-UrI7kvGkWn7LCLDJTm1y5fW7ZlDjx_tZXlgEBts08,18977
20
- llms/extensions/app/db.py,sha256=TTxiQup4RYuqlzUsOfrshW-89YyGCzK590wo0ySn8xA,24163
9
+ llms/extensions/app/README.md,sha256=TKoblZpHlheLCh_dfXOxqTc5OvxlgMBa-vKo8Hqb2gg,1370
10
+ llms/extensions/app/__init__.py,sha256=D8D0IymnaVaI-znD4B6zO7HS8M_M0h1Bj2lTEGr5Qdk,18750
11
+ llms/extensions/app/db.py,sha256=n_K0dYqXUeaX1DQnPeixCZBrKMvjnz867MtjeBIxmv4,24188
21
12
  llms/extensions/app/db_manager.py,sha256=NcdOK_FzEmzCYEoQjdivZTrgJdFf9dGlAelJvP4VecA,7046
22
- llms/extensions/app/requests.json,sha256=xMQ_FgMaBxbrCcTnsdkaBvufy40yFT7U1kR6nn_GaNE,264556
23
- llms/extensions/app/threads.json,sha256=f_xPjkmY2OGbGnSXxVTcSGKRU-2rvfAXnHbf2pH1K5Q,741352
24
- llms/extensions/app/__pycache__/__init__.cpython-314.pyc,sha256=xpU2rCIqsC19tihBMJcd41FTMq08Hhr3fTtuLwknMn0,26695
25
- llms/extensions/app/__pycache__/db.cpython-314.pyc,sha256=RPDnz59j1I1AXWanfQvKpe5x5NeITTCVKj_AC5HDJjc,35533
26
- llms/extensions/app/__pycache__/db_manager.cpython-314.pyc,sha256=mS-NkAbnGYTDQfsKXZufkI9LnOBSWD5fYNMqTVjQrnE,11071
27
13
  llms/extensions/app/ui/Recents.mjs,sha256=HT9R2IEus3dGEqtKPGrgX1eMp4EQ2j2jLwv-Fn1Us5E,9253
28
- llms/extensions/app/ui/index.mjs,sha256=XAHNYiAYHo8dRbsA5Q-FwiNFI5wY6YNgRf6exVykQAA,13255
29
- llms/extensions/app/ui/threadStore.mjs,sha256=oHsgiigafgT4j8XeF9taOSOL8dRCkrhBa-ZhcPUQtAs,11283
30
- llms/extensions/core_tools/__init__.py,sha256=n899CEgys77Tq28bKtoT84fjPE8Fy8_bWeeNk9aLgbY,21448
31
- llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc,sha256=zEgv3hINN2nZFzXTnugdr16k9_9MakduF34094fI0JQ,32394
32
- llms/extensions/core_tools/ui/index.mjs,sha256=dwUzQAS0TnSgXOfoYBA6cIhJk3HZ8g6cefMy8zL78yE,31737
14
+ llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
15
+ llms/extensions/app/ui/threadStore.mjs,sha256=oCPPegkG3QHZIB82jwSCZ4d9dWEyhn1z1_Zo2dho4Bg,11588
16
+ llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
17
+ llms/extensions/core_tools/__init__.py,sha256=S9Pr08RtZtVpx8v6hyG_qVhfEJbT2JvmAD-AJTQZWmU,21468
18
+ llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
33
19
  llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js,sha256=FDwwFMKSVPNTHMML5tkCBQhLz8Ns_6b5sqRv1CpAviA,7123
34
20
  llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js,sha256=b74rk8wXRNnhStHWE0SffhbfTCqihC9ljvwXq_Zi-FA,8544
35
21
  llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js,sha256=a6nNlSi3Tn929LnOntBne_7XBX0areAFAYU2jP0OouM,3989
@@ -41,8 +27,6 @@ llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js,sha25
41
27
  llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js,sha256=_df_U9DKeWxeN5LOtQY8hNBzW8rxmKHAbHiIDxxmSiI,3295
42
28
  llms/extensions/core_tools/ui/codemirror/doc/docs.css,sha256=apFfZ7aIURmhMA5bPWqPasrUeNQQbyIj3RQ8A5cwV94,3315
43
29
  llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff,sha256=4ppXym_xSqFSK1sYxUPXogFs3Xu6YyHWBN-jUZ8Osec,29448
44
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
45
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
46
30
  llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js,sha256=BYoKZKIGseTbzBmm_6QBWoS7a_4T0LqFdovhHe9bTtI,37362
47
31
  llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html,sha256=K5xIggY1lgSYrcM9UhLcniq6G5zM_4Jl29cb_1YvHFQ,4668
48
32
  llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js,sha256=9do6jQ3GPCXs0-d8rPV89EMd8Lq_WU_TsZwrHT4imic,40636
@@ -50,13 +34,12 @@ llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html,sha256=
50
34
  llms/extensions/core_tools/ui/codemirror/mode/python/python.js,sha256=GaWco4et2wTpUALJrb4rjCMUJ85JNprFNxB-MIimlHw,14984
51
35
  llms/extensions/core_tools/ui/codemirror/theme/dracula.css,sha256=Av32BJYI3djQ189kA7blslEzB0Dfw5N3T2i7ZHJ7PG4,2042
52
36
  llms/extensions/core_tools/ui/codemirror/theme/mocha.css,sha256=0Y1y9DUgzBSakbXep55HuqOYiPMC-YK3xjVQBiwUQ4g,2402
37
+ llms/extensions/gallery/README.md,sha256=zif27qiMef1dBboMEPvTJqPDnLvrqntraVSw8oQ-1RM,2985
53
38
  llms/extensions/gallery/__init__.py,sha256=6YrgWsrfQXviFsJETFJxDlaEf0DAaPPBzokPxeK6AvU,1583
54
39
  llms/extensions/gallery/db.py,sha256=hMsy0NMSKudA4HPUMvffMhXhOmqgVD31Ej_UmPrlbEg,11436
55
- llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc,sha256=qVYj7_SMudEoxz7BJKsUN_BNEfm9COYKArAIrl30Ynw,3384
56
- llms/extensions/gallery/__pycache__/db.cpython-314.pyc,sha256=Is7YTzoWVOp-2NnafjibWw7mbCnw2MejGZUrlcyCfeg,15708
57
- llms/extensions/gallery/ui/index.mjs,sha256=Vfnqs1UJffnWEBuy1BoklsNXKgtcIVoNtDy7cVpS78M,28281
40
+ llms/extensions/gallery/ui/index.mjs,sha256=1kPvtavUie0KtXCw3YjJpokJyl9zixAoEkcDfSYSfVk,28313
41
+ llms/extensions/katex/README.md,sha256=fD_0riNXrKW0SfehifIc3jnXKg9diQdlXVq5X_e1zTc,1473
58
42
  llms/extensions/katex/__init__.py,sha256=CvEe9CPtzoANc4AFuxZTbrJZdggoWLuKnENKfEdncPQ,206
59
- llms/extensions/katex/__pycache__/__init__.cpython-314.pyc,sha256=0oIxzaTcTIWR7KuMF_Wkpj-nlxJjVKKv021xXb74hPk,594
60
43
  llms/extensions/katex/ui/README.md,sha256=Xkjgncuvv4WT4TzNX4muWHYKJOwZ-kSpNnyveLlJDNU,7268
61
44
  llms/extensions/katex/ui/index.mjs,sha256=K54EGfcnQwvqmPiJAMgNplnq1t9AaCHsXvTcVBdbl_4,2829
62
45
  llms/extensions/katex/ui/katex-swap.css,sha256=TFnBXg_P8omwxMkHbFFw7jRpnB11EGzV-z2NdUVi_x4,31769
@@ -149,24 +132,16 @@ llms/extensions/providers/google.py,sha256=khH8F9uQueHdqMdMx9SvnD1AbBUp_KSZBVwH1
149
132
  llms/extensions/providers/nvidia.py,sha256=AokVo18QBqB9xAbIWkcum4SefrwHflhtoIxGWuBycIM,4366
150
133
  llms/extensions/providers/openai.py,sha256=qC5o-On3enNS_zSNNfGNHzDa0-Ca50Moz-7kilxd0q0,6234
151
134
  llms/extensions/providers/openrouter.py,sha256=gVUIa1DhbrEG7S8_-Qkxa0kdtHT8Doj3El0DO-q_tcQ,3253
152
- llms/extensions/providers/__pycache__/__init__.cpython-314.pyc,sha256=_V6L2wMvy-HQMmz7bvnegp4NjxmTgP7_AR-d9SUN3dc,797
153
- llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc,sha256=93ULyorNB8bBHRGOu-38HXy4BnkuDKJkOm_Vo6PP62g,10933
154
- llms/extensions/providers/__pycache__/chutes.cpython-314.pyc,sha256=QH2fiGb6VueqWNjN0RwizVpPOeqdN78s2rp_WoR0DrA,7367
155
- llms/extensions/providers/__pycache__/google.cpython-314.pyc,sha256=STxidyM6xp0vwkCLO29wDTIw1jXluDBIB4KLNKf4c14,17473
156
- llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc,sha256=UOsgdqA2-9E5jVo2CbytViJxrk5AEdXJvH9X0gmK_mA,6216
157
- llms/extensions/providers/__pycache__/openai.cpython-314.pyc,sha256=mu8QC52_OUwtFX89FN_WXZgkgoFglvF1gDukN4ge8Rk,8735
158
- llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc,sha256=LknnfQPVrXB2-7GCKVHoXIk6mW2ghRlQmn8piwQCv3I,5335
135
+ llms/extensions/system_prompts/README.md,sha256=ayr18lnSsGp62bunC6kxkvcSvZki775rbZ-8VoMDQEc,597
159
136
  llms/extensions/system_prompts/__init__.py,sha256=TZy1CS2dPkBNBA_Ovf9BlVetZqTt2NgnsrZi6Mtg_C0,1535
160
- llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc,sha256=mftPdTu1qDLxifGSy9TkAAYPXxOkuNv7dUmQoZBC5Uk,2168
161
- llms/extensions/system_prompts/ui/index.mjs,sha256=uUUGSiBGOECzvHriqnAJIGXmlyB3JLKlg5F-PgjnBx8,12197
162
- llms/extensions/system_prompts/ui/prompts.json,sha256=eu7h4i2XAEcrID2Zr2ma0pweg2WfFehDAvTPaToqcBk,128484
137
+ llms/extensions/system_prompts/ui/index.mjs,sha256=_pVCreAebSzE9dzcHF2kiYODwP-fDHCqtUQB-X5Io9Q,12107
138
+ llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdoYDrVzfyc8TO5OaotI,128489
163
139
  llms/extensions/tools/__init__.py,sha256=yfIK7dVqYiZGX5VeJ3x7HQWLPQfuPqeNYJsd0lpZUM4,120
164
- llms/extensions/tools/__pycache__/__init__.cpython-314.pyc,sha256=3H5i6ooI1LCCdVjZPDBteU2Ov6nYSeLAk9kUl6F9pZg,641
165
140
  llms/extensions/tools/ui/index.mjs,sha256=Nu69U6odCUh8uu1i8d5f8ryO4Lj_OFbPX2LnVyYu1fk,9602
166
141
  llms/ui/App.mjs,sha256=zU-GtbcSMREizjUS9nWiMK6m_oT14MNJ-p_RCz2RVqA,7445
167
- llms/ui/ai.mjs,sha256=OHde8wtLWX-LH9Z2vlxVAvsKODiVlWg0hD9-l24ZukY,6087
142
+ llms/ui/ai.mjs,sha256=aEzcYd3IWHmDvKAuFcbRMaOAm7mpTYHNzZww82Bqdtw,6540
168
143
  llms/ui/app.css,sha256=VcyYn6-qinFH7iOkIxUb5dmPDjLDcDBvgEOaRaeyg1E,173909
169
- llms/ui/ctx.mjs,sha256=pygZxLcscWqRT54xDEcFDw-wIaS63E0OuMqDhJPrKLE,10568
144
+ llms/ui/ctx.mjs,sha256=UTdIvJUPoD7bWuAX8ju2jA8PDTP_wfVccyVoXauArmo,11174
170
145
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
171
146
  llms/ui/index.mjs,sha256=j2rkXwpxPpBsurWLvvN6a25cVu7r9s9avP9ozKOpzMA,4253
172
147
  llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
@@ -186,13 +161,12 @@ llms/ui/lib/vue.min.mjs,sha256=T1TVu9SFEoLArPLKKEp6gsj_eScmHl5TkUebxGK6ldk,16628
186
161
  llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
187
162
  llms/ui/modules/layout.mjs,sha256=ft5dOT-fBegSmSPQKnktHKfpbmNFan8ZN44z25T8ig8,10892
188
163
  llms/ui/modules/model-selector.mjs,sha256=TrXxOIeNgibNMu_6M-wROjQgmHJPrVxH404v1_kXF4c,67486
189
- llms/ui/modules/chat/ChatBody.mjs,sha256=ISZy1D63gpd9PpJ0EiZQYFf10LC2uI5Xt0SS3qQSL-0,42167
190
- llms/ui/modules/chat/HomeTools.mjs,sha256=Jak12OvR8DZ6CmrWMMxELoNS8864EtMrhmiQp4SFfoM,213
164
+ llms/ui/modules/chat/ChatBody.mjs,sha256=0G2E82RnlRxVjW6xWRFXWJF8vjMZJfdeddcE66M4Wxg,42289
191
165
  llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
192
- llms/ui/modules/chat/index.mjs,sha256=TFxdCN7qw8JW1OphkhZUX8KxKJdBIwsL7QkavKuYDwQ,34516
193
- llms_py-3.0.0b9.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
194
- llms_py-3.0.0b9.dist-info/METADATA,sha256=-XTdbNmAvk6mJtZXS8Lt_qs0Asm5x5_Ety_dwCmTmGk,2193
195
- llms_py-3.0.0b9.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
196
- llms_py-3.0.0b9.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
197
- llms_py-3.0.0b9.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
198
- llms_py-3.0.0b9.dist-info/RECORD,,
166
+ llms/ui/modules/chat/index.mjs,sha256=sTKf7pwCkyu_Ls--pE3yrr2DSztuKQtLT7kFffaHIVU,33678
167
+ llms_py-3.0.1.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
168
+ llms_py-3.0.1.dist-info/METADATA,sha256=D4SsSqtkOU2pRuKlZUXa49YX0rSKPgvDcbzm1HdRYL8,2191
169
+ llms_py-3.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
170
+ llms_py-3.0.1.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
171
+ llms_py-3.0.1.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
172
+ llms_py-3.0.1.dist-info/RECORD,,
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file