llms-py 3.0.0b6__py3-none-any.whl → 3.0.0b8__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 (181) hide show
  1. llms/__pycache__/main.cpython-314.pyc +0 -0
  2. llms/{ui/modules/analytics.mjs → extensions/analytics/ui/index.mjs} +55 -164
  3. llms/extensions/app/__init__.py +519 -0
  4. llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
  5. llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
  6. llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
  7. llms/extensions/app/db.py +641 -0
  8. llms/extensions/app/db_manager.py +195 -0
  9. llms/extensions/app/requests.json +9073 -0
  10. llms/extensions/app/threads.json +15290 -0
  11. llms/{ui/modules/threads → extensions/app/ui}/Recents.mjs +82 -55
  12. llms/{ui/modules/threads → extensions/app/ui}/index.mjs +83 -20
  13. llms/extensions/app/ui/threadStore.mjs +407 -0
  14. llms/extensions/core_tools/__init__.py +598 -0
  15. llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
  16. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
  17. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
  18. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
  19. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
  20. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
  21. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
  22. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
  23. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
  24. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
  25. llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
  26. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  27. llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +344 -0
  28. llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +9884 -0
  29. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
  30. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
  31. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
  32. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
  33. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
  34. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
  35. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
  36. llms/extensions/core_tools/ui/index.mjs +650 -0
  37. llms/extensions/gallery/__init__.py +61 -0
  38. llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc +0 -0
  39. llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
  40. llms/extensions/gallery/db.py +298 -0
  41. llms/extensions/gallery/ui/index.mjs +481 -0
  42. llms/extensions/katex/__init__.py +6 -0
  43. llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
  44. llms/extensions/katex/ui/README.md +125 -0
  45. llms/extensions/katex/ui/contrib/auto-render.js +338 -0
  46. llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
  47. llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
  48. llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
  49. llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
  50. llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
  51. llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
  52. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
  53. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
  54. llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
  55. llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
  56. llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
  57. llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
  58. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
  59. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
  60. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  61. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  62. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  63. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  64. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  65. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  66. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  67. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  68. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  69. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  70. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  71. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  72. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  73. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  74. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  75. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  76. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  77. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  78. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  79. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  80. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  81. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  82. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  83. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  84. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  85. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  86. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  87. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  88. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  89. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  90. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  91. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  92. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  93. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  94. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  95. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  96. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  97. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  98. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  99. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  100. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  101. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  102. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  103. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  104. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  115. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  116. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  117. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  118. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  119. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  120. llms/extensions/katex/ui/index.mjs +92 -0
  121. llms/extensions/katex/ui/katex-swap.css +1230 -0
  122. llms/extensions/katex/ui/katex-swap.min.css +1 -0
  123. llms/extensions/katex/ui/katex.css +1230 -0
  124. llms/extensions/katex/ui/katex.js +19080 -0
  125. llms/extensions/katex/ui/katex.min.css +1 -0
  126. llms/extensions/katex/ui/katex.min.js +1 -0
  127. llms/extensions/katex/ui/katex.min.mjs +1 -0
  128. llms/extensions/katex/ui/katex.mjs +18547 -0
  129. llms/extensions/providers/__init__.py +18 -0
  130. llms/extensions/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  131. llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  132. llms/extensions/providers/__pycache__/chutes.cpython-314.pyc +0 -0
  133. llms/extensions/providers/__pycache__/google.cpython-314.pyc +0 -0
  134. llms/{providers → extensions/providers}/__pycache__/nvidia.cpython-314.pyc +0 -0
  135. llms/{providers → extensions/providers}/__pycache__/openai.cpython-314.pyc +0 -0
  136. llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
  137. llms/{providers → extensions/providers}/anthropic.py +45 -5
  138. llms/{providers → extensions/providers}/chutes.py +21 -18
  139. llms/{providers → extensions/providers}/google.py +99 -27
  140. llms/{providers → extensions/providers}/nvidia.py +6 -8
  141. llms/{providers → extensions/providers}/openai.py +3 -6
  142. llms/{providers → extensions/providers}/openrouter.py +12 -10
  143. llms/extensions/system_prompts/__init__.py +45 -0
  144. llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc +0 -0
  145. llms/extensions/system_prompts/ui/index.mjs +285 -0
  146. llms/extensions/system_prompts/ui/prompts.json +1067 -0
  147. llms/extensions/tools/__init__.py +5 -0
  148. llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  149. llms/{ui/modules/tools.mjs → extensions/tools/ui/index.mjs} +12 -10
  150. llms/index.html +26 -38
  151. llms/llms.json +20 -1
  152. llms/main.py +845 -245
  153. llms/providers-extra.json +0 -32
  154. llms/ui/App.mjs +18 -20
  155. llms/ui/ai.mjs +38 -15
  156. llms/ui/app.css +1440 -59
  157. llms/ui/ctx.mjs +154 -18
  158. llms/ui/index.mjs +17 -14
  159. llms/ui/lib/vue.min.mjs +10 -9
  160. llms/ui/lib/vue.mjs +1796 -1635
  161. llms/ui/markdown.mjs +4 -2
  162. llms/ui/modules/chat/ChatBody.mjs +101 -334
  163. llms/ui/modules/chat/HomeTools.mjs +12 -0
  164. llms/ui/modules/chat/SettingsDialog.mjs +1 -1
  165. llms/ui/modules/chat/index.mjs +351 -314
  166. llms/ui/modules/layout.mjs +2 -26
  167. llms/ui/modules/model-selector.mjs +3 -3
  168. llms/ui/tailwind.input.css +35 -1
  169. llms/ui/utils.mjs +33 -3
  170. {llms_py-3.0.0b6.dist-info → llms_py-3.0.0b8.dist-info}/METADATA +1 -1
  171. llms_py-3.0.0b8.dist-info/RECORD +198 -0
  172. llms/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  173. llms/providers/__pycache__/chutes.cpython-314.pyc +0 -0
  174. llms/providers/__pycache__/google.cpython-314.pyc +0 -0
  175. llms/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
  176. llms/ui/modules/threads/threadStore.mjs +0 -586
  177. llms_py-3.0.0b6.dist-info/RECORD +0 -66
  178. {llms_py-3.0.0b6.dist-info → llms_py-3.0.0b8.dist-info}/WHEEL +0 -0
  179. {llms_py-3.0.0b6.dist-info → llms_py-3.0.0b8.dist-info}/entry_points.txt +0 -0
  180. {llms_py-3.0.0b6.dist-info → llms_py-3.0.0b8.dist-info}/licenses/LICENSE +0 -0
  181. {llms_py-3.0.0b6.dist-info → llms_py-3.0.0b8.dist-info}/top_level.txt +0 -0
llms/ui/ctx.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- import { reactive } from 'vue'
2
+ import { reactive, markRaw } from 'vue'
3
3
  import { EventBus, humanize, combinePaths } from "@servicestack/client"
4
4
  import { storageObject } from './utils.mjs'
5
5
 
@@ -19,33 +19,83 @@ export class ExtensionScope {
19
19
  setPrefs(o) {
20
20
  storageObject(this.storageKey, Object.assign(this.prefs, o))
21
21
  }
22
+ savePrefs() {
23
+ storageObject(this.storageKey, this.prefs)
24
+ }
22
25
  get(url, options) {
23
26
  return this.ctx.ai.get(combinePaths(this.baseUrl, url), options)
24
27
  }
28
+ delete(url, options) {
29
+ return this.ctx.ai.get(combinePaths(this.baseUrl, url), {
30
+ ...options,
31
+ method: 'DELETE'
32
+ })
33
+ }
25
34
  async getJson(url, options) {
26
35
  return this.ctx.ai.getJson(combinePaths(this.baseUrl, url), options)
27
36
  }
37
+ async deleteJson(url, options) {
38
+ return this.ctx.ai.getJson(combinePaths(this.baseUrl, url), {
39
+ ...options,
40
+ method: 'DELETE'
41
+ })
42
+ }
28
43
  post(url, options) {
29
44
  return this.ctx.ai.post(combinePaths(this.baseUrl, url), options)
30
45
  }
31
- async postJson(url, options) {
32
- return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), options)
46
+ async postForm(url, options) {
47
+ return await this.ctx.ai.postForm(combinePaths(this.baseUrl, url), options)
48
+ }
49
+ async postJson(url, body) {
50
+ return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
51
+ body: body instanceof FormData ? body : JSON.stringify(body)
52
+ })
53
+ }
54
+ async putJson(url, body) {
55
+ return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
56
+ method: 'PUT',
57
+ body: body instanceof FormData ? body : JSON.stringify(body)
58
+ })
59
+ }
60
+ async patchJson(url, body) {
61
+ return this.ctx.ai.postJson(combinePaths(this.baseUrl, url), {
62
+ method: 'PATCH',
63
+ body: body instanceof FormData ? body : JSON.stringify(body)
64
+ })
65
+ }
66
+ async createJsonResult(res) {
67
+ return this.ctx.ai.createJsonResult(res)
68
+ }
69
+ createErrorResult(e) {
70
+ return this.ctx.ai.createErrorResult(e)
71
+ }
72
+ setError(e, msg = null) {
73
+ const prefix = this.id ? `[${this.id}] ` : ''
74
+ this.ctx.setError(e, msg ? `${prefix} ${msg}` : prefix)
75
+ }
76
+ clearError() {
77
+ this.ctx.clearError()
78
+ }
79
+ toast(msg) {
80
+ this.ctx.toast(msg)
33
81
  }
34
82
  }
35
83
 
36
84
  export class AppContext {
37
- constructor({ app, routes, ai, fmt, utils }) {
85
+ constructor({ app, routes, ai, fmt, utils, marked }) {
38
86
  this.app = app
39
87
  this.routes = routes
40
88
  this.ai = ai
41
89
  this.fmt = fmt
42
90
  this.utils = utils
43
91
  this._components = {}
92
+ this.marked = marked
44
93
 
45
94
  this.state = reactive({})
46
95
  this.events = new EventBus()
47
96
  this.modalComponents = {}
48
97
  this.extensions = []
98
+ this.markedFilters = []
49
99
  this.chatRequestFilters = []
50
100
  this.chatResponseFilters = []
51
101
  this.chatErrorFilters = []
@@ -55,6 +105,8 @@ export class AppContext {
55
105
  this.left = {}
56
106
  this.layout = reactive(storageObject(`llms.layout`))
57
107
  this.prefs = reactive(storageObject(ai.prefsKey))
108
+ this._onRouterBeforeEach = []
109
+ this._onClass = []
58
110
 
59
111
  if (!Array.isArray(this.layout.hide)) {
60
112
  this.layout.hide = []
@@ -75,6 +127,9 @@ export class AppContext {
75
127
  }
76
128
  async init() {
77
129
  Object.assign(this.state, await this.ai.init(this))
130
+ Object.assign(this.fmt, {
131
+ markdown: this.renderMarkdown.bind(this)
132
+ })
78
133
  }
79
134
  setGlobals(globals) {
80
135
  Object.entries(globals).forEach(([name, global]) => {
@@ -130,8 +185,9 @@ export class AppContext {
130
185
  }
131
186
  modals(modals) {
132
187
  Object.keys(modals).forEach(name => {
133
- this.modalComponents[name] = modals[name]
134
- this.component(name, modals[name])
188
+ const modal = markRaw(modals[name])
189
+ this.modalComponents[name] = modal
190
+ this.component(name, modal)
135
191
  })
136
192
  }
137
193
  openModal(name) {
@@ -182,24 +238,104 @@ export class AppContext {
182
238
  layoutVisible(key) {
183
239
  return !this.layout.hide.includes(key)
184
240
  }
185
- toggleTop(name) {
186
- console.log('toggleTop', name)
187
- this.layout.top = this.layout.top == name ? undefined : name
241
+ toggleTop(name, toggle) {
242
+ if (toggle === false) {
243
+ this.layout.top = undefined
244
+ } else if (toggle === true) {
245
+ this.layout.top = name
246
+ } else {
247
+ this.layout.top = this.layout.top == name ? undefined : name
248
+ }
188
249
  storageObject(`llms.layout`, this.layout)
250
+ console.log('toggleTop', name, toggle, this.layout.top, this.layout.top === name)
251
+ return this.layout.top === name
189
252
  }
190
- togglePath(path) {
253
+ togglePath(path, toggle) {
191
254
  const currentPath = this.router.currentRoute.value?.path
192
- console.log('togglePath', path, currentPath)
193
- if (currentPath == path) {
194
- this.toggleLayout('left')
195
- } else {
255
+ console.log('togglePath', path, currentPath, toggle)
256
+ if (currentPath != path) {
257
+ if (toggle === undefined) {
258
+ toggle = true
259
+ }
196
260
  this.router.push({ path })
197
261
  }
262
+ this.toggleLayout('left', toggle)
263
+ return toggle
198
264
  }
199
- getJson(url, options) {
200
- return this.ai.getJson(url, options)
265
+
266
+ setError(error, msg = null) {
267
+ this.state.error = error
268
+ if (error) {
269
+ if (msg) {
270
+ console.error(error.message, msg, error)
271
+ } else {
272
+ console.error(error.message, error)
273
+ }
274
+ }
275
+ }
276
+ clearError() {
277
+ this.state.error = null
278
+ }
279
+
280
+ async getJson(url, options) {
281
+ return await this.ai.getJson(url, options)
282
+ }
283
+ async post(url, options) {
284
+ return await this.ai.post(url, options)
285
+ }
286
+ async postForm(url, options) {
287
+ return await this.ai.postForm(url, options)
288
+ }
289
+ async postJson(url, options) {
290
+ return await this.ai.postJson(url, options)
291
+ }
292
+ to(route) {
293
+ if (typeof route == 'string') {
294
+ route = route.startsWith(this.ai.base)
295
+ ? route
296
+ : combinePaths(this.ai.base, route)
297
+ const path = { path: route }
298
+ console.log('to', path)
299
+ this.router.push(path)
300
+ } else {
301
+ route.path = route.path.startsWith(this.ai.base)
302
+ ? route.path
303
+ : combinePaths(this.ai.base, route.path)
304
+ console.log('to', route)
305
+ this.router.push(route)
306
+ }
201
307
  }
202
- postJson(url, options) {
203
- return this.ai.postJson(url, options)
308
+
309
+ // Events
310
+ onRouterBeforeEach(callback) {
311
+ this._onRouterBeforeEach.push(callback)
312
+ }
313
+
314
+ onClass(callback) {
315
+ this._onClass.push(callback)
316
+ }
317
+
318
+ cls(id, cls) {
319
+ if (this._onClass.length) {
320
+ this._onClass.forEach(callback => {
321
+ cls = callback(id, cls) ?? cls
322
+ })
323
+ }
324
+ return cls
325
+ }
326
+ toast(msg) {
327
+ this.setState({ toast: msg })
328
+ }
329
+
330
+ renderMarkdown(content) {
331
+ if (Array.isArray(content)) {
332
+ content = content.filter(c => c.type === 'text').map(c => c.text).join('\n')
333
+ }
334
+ // if (content) {
335
+ // content = content
336
+ // .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">')
337
+ // .replaceAll('} \\]', '</span>\n')
338
+ // }
339
+ return this.marked.parse(content || '')
204
340
  }
205
341
  }
llms/ui/index.mjs CHANGED
@@ -6,12 +6,9 @@ import App from './App.mjs'
6
6
  import ai from './ai.mjs'
7
7
  import LayoutModule from './modules/layout.mjs'
8
8
  import ChatModule from './modules/chat/index.mjs'
9
- import ThreadsModule from './modules/threads/index.mjs'
10
9
  import ModelSelectorModule from './modules/model-selector.mjs'
11
- import AnalyticsModule from './modules/analytics.mjs'
12
- import ToolsModule from './modules/tools.mjs'
13
10
  import { utilsFunctions, utilsFormatters } from './utils.mjs'
14
- import { markdownFormatters } from './markdown.mjs'
11
+ import { marked, markdownFormatters } from './markdown.mjs'
15
12
  import { AppContext } from './ctx.mjs'
16
13
 
17
14
  const Components = {
@@ -20,10 +17,7 @@ const Components = {
20
17
  const BuiltInModules = {
21
18
  LayoutModule,
22
19
  ChatModule,
23
- ThreadsModule,
24
20
  ModelSelectorModule,
25
- AnalyticsModule,
26
- ToolsModule,
27
21
  }
28
22
 
29
23
 
@@ -35,11 +29,11 @@ export async function createContext() {
35
29
  app.component(name, Components[name])
36
30
  })
37
31
 
38
- const fmt = Object.assign({}, useFormatters(), utilsFormatters(), markdownFormatters())
32
+ const fmt = Object.assign({}, useFormatters(), utilsFormatters())
39
33
  const utils = Object.assign({}, utilsFunctions())
40
34
  const routes = []
41
35
 
42
- const ctx = new AppContext({ app, routes, ai, fmt, utils })
36
+ const ctx = new AppContext({ app, routes, ai, fmt, utils, marked })
43
37
  app.provide('ctx', ctx)
44
38
  await ctx.init()
45
39
 
@@ -48,13 +42,17 @@ export async function createContext() {
48
42
  ctx.modules = await Promise.all(validExtensions.map(async extension => {
49
43
  try {
50
44
  const module = await import(extension.path)
51
- return { extension, module }
45
+ const order = module.default.order || 0
46
+ return { extension, module, order }
52
47
  } catch (e) {
53
48
  console.error(`Failed to load extension module ${extension.name}:`, e)
54
49
  return null
55
50
  }
56
51
  }))
57
52
 
53
+ // sort modules by order
54
+ ctx.modules.sort((a, b) => a.order - b.order)
55
+
58
56
  const installedModules = []
59
57
 
60
58
  // Install built-in modules sequentially
@@ -97,16 +95,21 @@ export async function createContext() {
97
95
 
98
96
  ctx.router.beforeEach((to, from) => {
99
97
  const title = to.meta.title || 'Chat'
100
- console.log('beforeEach', to.path, title)
98
+ console.debug('router:change', to.path, title)
101
99
  ctx.setLayout({ path: to.path })
102
100
  ctx.setState({ title })
103
101
  document.title = title
104
102
  return true
105
103
  })
104
+ ctx._onRouterBeforeEach.forEach(ctx.router.beforeEach)
106
105
 
107
- if (ctx.layout.path && location.pathname === '/' && !location.search) {
108
- console.log('redirecting to saved path: ', ctx.layout.path)
109
- ctx.router.push({ path: ctx.layout.path })
106
+ if (ai.hasAccess) {
107
+ if (ctx.layout.path && location.pathname === '/' && !location.search) {
108
+ console.log('redirecting to saved path: ', ctx.layout.path)
109
+ ctx.router.push({ path: ctx.layout.path })
110
+ }
111
+ } else {
112
+ ctx.router.push({ path: '/' })
110
113
  }
111
114
 
112
115
  const loadModules = installedModules.filter(x => x.module.default && x.module.default.load)