llms-py 2.0.34__py3-none-any.whl → 3.0.0__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 (207) hide show
  1. llms/__init__.py +3 -1
  2. llms/__pycache__/__init__.cpython-312.pyc +0 -0
  3. llms/__pycache__/__init__.cpython-313.pyc +0 -0
  4. llms/__pycache__/__init__.cpython-314.pyc +0 -0
  5. llms/__pycache__/__main__.cpython-312.pyc +0 -0
  6. llms/__pycache__/__main__.cpython-314.pyc +0 -0
  7. llms/__pycache__/llms.cpython-312.pyc +0 -0
  8. llms/__pycache__/main.cpython-312.pyc +0 -0
  9. llms/__pycache__/main.cpython-313.pyc +0 -0
  10. llms/__pycache__/main.cpython-314.pyc +0 -0
  11. llms/__pycache__/plugins.cpython-314.pyc +0 -0
  12. llms/{ui/Analytics.mjs → extensions/analytics/ui/index.mjs} +154 -238
  13. llms/extensions/app/README.md +20 -0
  14. llms/extensions/app/__init__.py +530 -0
  15. llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
  16. llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
  17. llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
  18. llms/extensions/app/db.py +644 -0
  19. llms/extensions/app/db_manager.py +195 -0
  20. llms/extensions/app/requests.json +9073 -0
  21. llms/extensions/app/threads.json +15290 -0
  22. llms/{ui → extensions/app/ui}/Recents.mjs +91 -65
  23. llms/{ui/Sidebar.mjs → extensions/app/ui/index.mjs} +124 -58
  24. llms/extensions/app/ui/threadStore.mjs +411 -0
  25. llms/extensions/core_tools/CALCULATOR.md +32 -0
  26. llms/extensions/core_tools/__init__.py +598 -0
  27. llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
  28. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
  29. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
  30. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
  31. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
  32. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
  33. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
  34. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
  35. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
  36. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
  37. llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
  38. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  39. llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +344 -0
  40. llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +9884 -0
  41. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
  42. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
  43. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
  44. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
  45. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
  46. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
  47. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
  48. llms/extensions/core_tools/ui/index.mjs +650 -0
  49. llms/extensions/gallery/README.md +61 -0
  50. llms/extensions/gallery/__init__.py +61 -0
  51. llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc +0 -0
  52. llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
  53. llms/extensions/gallery/db.py +298 -0
  54. llms/extensions/gallery/ui/index.mjs +482 -0
  55. llms/extensions/katex/README.md +39 -0
  56. llms/extensions/katex/__init__.py +6 -0
  57. llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
  58. llms/extensions/katex/ui/README.md +125 -0
  59. llms/extensions/katex/ui/contrib/auto-render.js +338 -0
  60. llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
  61. llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
  62. llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
  63. llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
  64. llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
  65. llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
  66. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
  67. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
  68. llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
  69. llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
  70. llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
  71. llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
  72. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
  73. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
  74. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  75. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  76. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  77. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  78. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  79. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  80. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  81. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  82. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  83. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  84. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  85. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  86. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  87. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  88. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  89. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  90. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  91. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  92. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  93. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  94. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  95. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  96. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  97. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  98. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  99. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  100. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  101. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  102. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  103. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  104. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  115. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  116. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  117. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  118. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  119. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  120. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  121. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  122. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  123. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  124. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  125. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  126. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  127. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  128. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  129. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  130. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  131. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  132. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  133. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  134. llms/extensions/katex/ui/index.mjs +92 -0
  135. llms/extensions/katex/ui/katex-swap.css +1230 -0
  136. llms/extensions/katex/ui/katex-swap.min.css +1 -0
  137. llms/extensions/katex/ui/katex.css +1230 -0
  138. llms/extensions/katex/ui/katex.js +19080 -0
  139. llms/extensions/katex/ui/katex.min.css +1 -0
  140. llms/extensions/katex/ui/katex.min.js +1 -0
  141. llms/extensions/katex/ui/katex.min.mjs +1 -0
  142. llms/extensions/katex/ui/katex.mjs +18547 -0
  143. llms/extensions/providers/__init__.py +18 -0
  144. llms/extensions/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  145. llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  146. llms/extensions/providers/__pycache__/chutes.cpython-314.pyc +0 -0
  147. llms/extensions/providers/__pycache__/google.cpython-314.pyc +0 -0
  148. llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc +0 -0
  149. llms/extensions/providers/__pycache__/openai.cpython-314.pyc +0 -0
  150. llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
  151. llms/extensions/providers/anthropic.py +229 -0
  152. llms/extensions/providers/chutes.py +155 -0
  153. llms/extensions/providers/google.py +378 -0
  154. llms/extensions/providers/nvidia.py +105 -0
  155. llms/extensions/providers/openai.py +156 -0
  156. llms/extensions/providers/openrouter.py +72 -0
  157. llms/extensions/system_prompts/README.md +22 -0
  158. llms/extensions/system_prompts/__init__.py +45 -0
  159. llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc +0 -0
  160. llms/extensions/system_prompts/ui/index.mjs +280 -0
  161. llms/extensions/system_prompts/ui/prompts.json +1067 -0
  162. llms/extensions/tools/__init__.py +5 -0
  163. llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  164. llms/extensions/tools/ui/index.mjs +204 -0
  165. llms/index.html +35 -77
  166. llms/llms.json +357 -1186
  167. llms/main.py +2847 -999
  168. llms/providers-extra.json +356 -0
  169. llms/providers.json +1 -0
  170. llms/ui/App.mjs +151 -60
  171. llms/ui/ai.mjs +132 -60
  172. llms/ui/app.css +2173 -161
  173. llms/ui/ctx.mjs +365 -0
  174. llms/ui/index.mjs +129 -0
  175. llms/ui/lib/charts.mjs +9 -13
  176. llms/ui/lib/servicestack-vue.mjs +3 -3
  177. llms/ui/lib/vue.min.mjs +10 -9
  178. llms/ui/lib/vue.mjs +1796 -1635
  179. llms/ui/markdown.mjs +18 -7
  180. llms/ui/modules/chat/ChatBody.mjs +691 -0
  181. llms/ui/{SettingsDialog.mjs → modules/chat/SettingsDialog.mjs} +9 -9
  182. llms/ui/modules/chat/index.mjs +828 -0
  183. llms/ui/modules/layout.mjs +243 -0
  184. llms/ui/modules/model-selector.mjs +851 -0
  185. llms/ui/tailwind.input.css +496 -80
  186. llms/ui/utils.mjs +161 -93
  187. {llms_py-2.0.34.dist-info → llms_py-3.0.0.dist-info}/METADATA +1 -1
  188. llms_py-3.0.0.dist-info/RECORD +202 -0
  189. llms/ui/Avatar.mjs +0 -85
  190. llms/ui/Brand.mjs +0 -52
  191. llms/ui/ChatPrompt.mjs +0 -590
  192. llms/ui/Main.mjs +0 -823
  193. llms/ui/ModelSelector.mjs +0 -78
  194. llms/ui/OAuthSignIn.mjs +0 -92
  195. llms/ui/ProviderIcon.mjs +0 -30
  196. llms/ui/ProviderStatus.mjs +0 -105
  197. llms/ui/SignIn.mjs +0 -64
  198. llms/ui/SystemPromptEditor.mjs +0 -31
  199. llms/ui/SystemPromptSelector.mjs +0 -56
  200. llms/ui/Welcome.mjs +0 -8
  201. llms/ui/threadStore.mjs +0 -563
  202. llms/ui.json +0 -1069
  203. llms_py-2.0.34.dist-info/RECORD +0 -48
  204. {llms_py-2.0.34.dist-info → llms_py-3.0.0.dist-info}/WHEEL +0 -0
  205. {llms_py-2.0.34.dist-info → llms_py-3.0.0.dist-info}/entry_points.txt +0 -0
  206. {llms_py-2.0.34.dist-info → llms_py-3.0.0.dist-info}/licenses/LICENSE +0 -0
  207. {llms_py-2.0.34.dist-info → llms_py-3.0.0.dist-info}/top_level.txt +0 -0
llms/ui/utils.mjs CHANGED
@@ -1,4 +1,5 @@
1
- import { $$, createElement, rightPart } from "@servicestack/client"
1
+ import { toRaw } from "vue"
2
+ import { rightPart } from "@servicestack/client"
2
3
 
3
4
  export function toJsonArray(json) {
4
5
  try {
@@ -30,127 +31,194 @@ export function storageObject(key, save) {
30
31
  return toJsonObject(localStorage.getItem(key)) ?? {}
31
32
  }
32
33
 
33
- export function deepClone(obj) {
34
- return JSON.parse(JSON.stringify(obj))
34
+ export function fileToBase64(file) {
35
+ return new Promise((resolve, reject) => {
36
+ const reader = new FileReader()
37
+ reader.readAsDataURL(file) //= "data:…;base64,…"
38
+ reader.onload = () => {
39
+ resolve(rightPart(reader.result, ',')) // strip prefix
40
+ }
41
+ reader.onerror = err => reject(err)
42
+ })
35
43
  }
36
44
 
37
- export function fileToBase64(file) {
38
- return new Promise((resolve, reject) => {
39
- const reader = new FileReader()
40
- reader.readAsDataURL(file) //= "data:…;base64,…"
41
- reader.onload = () => {
42
- resolve(rightPart(reader.result, ',')) // strip prefix
45
+ export function fileToDataUri(file) {
46
+ return new Promise((resolve, reject) => {
47
+ const reader = new FileReader()
48
+ reader.readAsDataURL(file) //= "data:…;base64,…"
49
+ reader.onload = () => resolve(reader.result)
50
+ reader.onerror = err => reject(err)
51
+ })
52
+ }
53
+
54
+ export function serializedClone(obj) {
55
+ try {
56
+ return JSON.parse(JSON.stringify(obj))
57
+ } catch (e) {
58
+ console.warn('Deep cloning failed, returning original value:', e)
59
+ return obj
43
60
  }
44
- reader.onerror = err => reject(err)
45
- })
46
61
  }
47
62
 
48
- export function fileToDataUri(file) {
49
- return new Promise((resolve, reject) => {
50
- const reader = new FileReader()
51
- reader.readAsDataURL(file) //= "data:…;base64,…"
52
- reader.onload = () => resolve(reader.result)
53
- reader.onerror = err => reject(err)
54
- })
63
+ export function deepClone(o) {
64
+ if (o === null || typeof o !== 'object') return o
65
+
66
+ // Handle Array objects
67
+ if (Array.isArray(o)) {
68
+ return o.map(x => deepClone(x))
69
+ }
70
+
71
+ if (typeof structuredClone === 'function') { // available (modern browsers, Node.js 17+)
72
+ try {
73
+ return structuredClone(o)
74
+ } catch (e) {
75
+ console.warn('structuredClone failed, falling back to JSON:', e)
76
+ console.log(o)
77
+ // console.log(JSON.stringify(o, undefined, 2))
78
+ }
79
+ }
80
+
81
+ // Fallback to JSON stringify/parse for older environments
82
+ return serializedClone(o)
55
83
  }
56
84
 
57
85
  export function toModelInfo(model) {
58
86
  if (!model) return undefined
59
- return Object.assign({}, model, { pricing: Object.assign({}, model.pricing) || undefined })
87
+ const props = ['id', 'name', 'provider', 'cost', 'modalities']
88
+ const to = {}
89
+ props.forEach(k => to[k] = toRaw(model[k]))
90
+ return deepClone(to)
60
91
  }
61
92
 
62
- const numFmt = new Intl.NumberFormat(undefined,{style:'currency',currency:'USD', maximumFractionDigits:6})
63
- export function tokenCost(price) {
93
+ export function pluralize(word, count) {
94
+ return count === 1 ? word : word + 's'
95
+ }
96
+
97
+ const currFmt2 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 2 })
98
+ const currFmt6 = new Intl.NumberFormat(undefined, { style: 'currency', currency: 'USD', maximumFractionDigits: 6 })
99
+
100
+ export function tokenCost(price, tokens = 1) {
64
101
  if (!price) return ''
65
- var ret = numFmt.format(parseFloat(price))
102
+ var ret = currFmt2.format(parseFloat(price) * tokens)
66
103
  return ret.endsWith('.00') ? ret.slice(0, -3) : ret
67
104
  }
105
+ export function tokenCostLong(price, tokens = 1) {
106
+ if (!price) return ''
107
+ const ret = currFmt6.format(parseFloat(price) * tokens)
108
+ return ret.endsWith('.000000') ? ret.slice(0, -7) : ret
109
+ }
68
110
  export function formatCost(cost) {
69
111
  if (!cost) return ''
70
- return numFmt.format(parseFloat(cost))
112
+ return currFmt2.format(parseFloat(cost))
71
113
  }
72
- export function statsTitle(stats) {
114
+ export function tokensTitle(usage) {
73
115
  let title = []
74
- // Each stat on its own line
75
- if (stats.cost) {
76
- title.push(`Total Cost: ${formatCost(stats.cost)}`)
116
+ if (usage.tokens && usage.price) {
117
+ const msg = parseFloat(usage.price) > 0
118
+ ? `${usage.tokens} tokens @ ${usage.price} = ${tokenCostLong(usage.price, usage.tokens)}`
119
+ : `${usage.tokens} tokens`
120
+ const duration = usage.duration ? ` in ${usage.duration}ms` : ''
121
+ title.push(msg + duration)
77
122
  }
78
- if (stats.inputTokens) {
79
- title.push(`Input Tokens: ${stats.inputTokens}`)
123
+ return title.join('\n')
124
+ }
125
+
126
+ // Accessible in views via $fmt
127
+ export function utilsFormatters() {
128
+ function relativeTime(timestamp) {
129
+ const now = new Date()
130
+ const date = new Date(timestamp)
131
+ const diffInSeconds = Math.floor((now - date) / 1000)
132
+
133
+ if (diffInSeconds < 60) return 'Just now'
134
+ if (diffInSeconds < 3600) return `${Math.floor(diffInSeconds / 60)}m ago`
135
+ if (diffInSeconds < 86400) return `${Math.floor(diffInSeconds / 3600)}h ago`
136
+ if (diffInSeconds < 604800) return `${Math.floor(diffInSeconds / 86400)}d ago`
137
+
138
+ return date.toLocaleDateString()
80
139
  }
81
- if (stats.outputTokens) {
82
- title.push(`Output Tokens: ${stats.outputTokens}`)
140
+ function costLong(cost) {
141
+ if (!cost) return ''
142
+ const ret = currFmt6.format(parseFloat(cost))
143
+ return ret.endsWith('.000000') ? ret.slice(0, -7) : ret
83
144
  }
84
- if (stats.requests) {
85
- title.push(`Requests: ${stats.requests}`)
145
+ function statsTitle(stats) {
146
+ let title = []
147
+ // Each stat on its own line
148
+ if (stats.cost) {
149
+ title.push(`Total Cost: ${costLong(stats.cost)}`)
150
+ }
151
+ if (stats.inputTokens) {
152
+ title.push(`Input Tokens: ${stats.inputTokens}`)
153
+ }
154
+ if (stats.outputTokens) {
155
+ title.push(`Output Tokens: ${stats.outputTokens}`)
156
+ }
157
+ if (stats.requests) {
158
+ title.push(`Requests: ${stats.requests}`)
159
+ }
160
+ if (stats.duration) {
161
+ title.push(`Duration: ${stats.duration}ms`)
162
+ }
163
+ return title.join('\n')
86
164
  }
87
- if (stats.duration) {
88
- title.push(`Duration: ${stats.duration}ms`)
165
+
166
+ function time(timestamp) {
167
+ return new Date(timestamp).toLocaleTimeString([], {
168
+ hour: '2-digit',
169
+ minute: '2-digit'
170
+ })
89
171
  }
90
- return title.join('\n')
91
- }
92
172
 
93
- const svg = {
94
- clipboard: `<svg class="w-6 h-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g fill="none"><path d="M8 5H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1M8 5a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2M8 5a2 2 0 0 1 2-2h2a2 2 0 0 1 2 2m0 0h2a2 2 0 0 1 2 2v3m2 4H10m0 0l3-3m-3 3l3 3" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></g></svg>`,
95
- check: `<svg class="w-6 h-6 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>`,
96
- }
97
-
98
- function copyBlock(btn) {
99
- // console.log('copyBlock',btn)
100
- const label = btn.previousElementSibling
101
- const code = btn.parentElement.nextElementSibling
102
- label.classList.remove('hidden')
103
- label.innerHTML = 'copied'
104
- btn.classList.add('border-gray-600', 'bg-gray-700')
105
- btn.classList.remove('border-gray-700')
106
- btn.innerHTML = svg.check
107
- navigator.clipboard.writeText(code.innerText)
108
- setTimeout(() => {
109
- label.classList.add('hidden')
110
- label.innerHTML = ''
111
- btn.innerHTML = svg.clipboard
112
- btn.classList.remove('border-gray-600', 'bg-gray-700')
113
- btn.classList.add('border-gray-700')
114
- }, 2000)
115
- }
116
-
117
- export function addCopyButtonToCodeBlocks(sel) {
118
- globalThis.copyBlock ??= copyBlock
119
- //console.log('addCopyButtonToCodeBlocks', sel, [...$$(sel)].length)
120
-
121
- $$(sel).forEach(code => {
122
- let pre = code.parentElement;
123
- if (pre.classList.contains('group')) return
124
- pre.classList.add('relative', 'group')
125
-
126
- const div = createElement('div', {attrs: {className: 'opacity-0 group-hover:opacity-100 transition-opacity duration-100 flex absolute right-2 -mt-1 select-none'}})
127
- const label = createElement('div', {attrs: {className: 'hidden font-sans p-1 px-2 mr-1 rounded-md border border-gray-600 bg-gray-700 text-gray-400'}})
128
- const btn = createElement('button', {
129
- attrs: {
130
- type: 'button',
131
- className: 'p-1 rounded-md border block text-gray-500 hover:text-gray-400 border-gray-700 hover:border-gray-600',
132
- onclick: 'copyBlock(this)'
133
- }
173
+ function shortDate(ts) {
174
+ if (!ts) return ''
175
+ const date = typeof ts === 'number' ? new Date(ts * 1000) : new Date(ts)
176
+ return date.toLocaleDateString(undefined, {
177
+ month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit'
134
178
  })
135
- btn.innerHTML = svg.clipboard
136
- div.appendChild(label)
137
- div.appendChild(btn)
138
- pre.insertBefore(div, code)
139
- })
140
- }
179
+ }
141
180
 
142
- export function addCopyButtons() {
143
- addCopyButtonToCodeBlocks('.prose pre>code')
181
+
182
+ return {
183
+ currFmt: currFmt2,
184
+ tokenCost,
185
+ tokenCostLong,
186
+ tokensTitle,
187
+ cost: formatCost,
188
+ costLong,
189
+ statsTitle,
190
+ relativeTime,
191
+ time,
192
+ pluralize,
193
+ shortDate,
194
+ }
144
195
  }
145
196
 
146
197
  /**
147
198
  * Returns an ever-increasing unique integer id.
148
199
  */
149
200
  export const nextId = (() => {
150
- let last = 0 // cache of the last id that was handed out
151
- return () => {
152
- const now = Date.now() // current millisecond timestamp
153
- last = (now > last) ? now : last + 1
154
- return last
155
- }
156
- })();
201
+ let last = 0 // cache of the last id that was handed out
202
+ return () => {
203
+ const now = Date.now() // current millisecond timestamp
204
+ last = (now > last) ? now : last + 1
205
+ return last
206
+ }
207
+ })();
208
+
209
+ export function utilsFunctions() {
210
+ return {
211
+ nextId,
212
+ toJsonArray,
213
+ toJsonObject,
214
+ storageArray,
215
+ storageObject,
216
+ fileToBase64,
217
+ fileToDataUri,
218
+ serializedClone,
219
+ deepClone,
220
+ toModelInfo,
221
+ pluralize,
222
+ }
223
+ }
224
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 2.0.34
3
+ Version: 3.0.0
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
@@ -0,0 +1,202 @@
1
+ llms/__init__.py,sha256=DKwTZDsyYL_wHe7yvLw49Nf8PSgPSyWaeVdotUqSvrQ,84
2
+ llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
+ llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
4
+ llms/llms.json,sha256=sgHUcE6iu-MOIoEbs8ZOH1O07ziXP58UUGnEILeeAxg,11086
5
+ llms/main.py,sha256=0VV1Ki73uZetjp6TQFpvis05Ju1xKqLIDGUjBhMxLJY,154259
6
+ llms/providers-extra.json,sha256=w7_5gB0YUPK0PJNeViM7vRDfNGChXUKMHfGHenVxEkM,10165
7
+ llms/providers.json,sha256=5pxk0HRgyKQkW_EmA9LjSC3zqNfVo0h-qYg--i0Fy1Y,283185
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=KnKrW52pSMB6s_aynHLtH299ldXLpRqjvUjQMHKFmcU,199830
17
+ llms/__pycache__/plugins.cpython-314.pyc,sha256=fer8nTkidG_vQSx80tL2bAvMS0opDom93bewjseFcyg,3560
18
+ llms/extensions/analytics/ui/index.mjs,sha256=cr9dPmEJjha2xX6A_7xbJxkOolWFP1p6TgIoO8M8juI,69540
19
+ llms/extensions/app/README.md,sha256=TKoblZpHlheLCh_dfXOxqTc5OvxlgMBa-vKo8Hqb2gg,1370
20
+ llms/extensions/app/__init__.py,sha256=2fJNC-zxaXQnBz6WePV61zjITeAQEW9BMboyErJuZAE,19285
21
+ llms/extensions/app/db.py,sha256=n_K0dYqXUeaX1DQnPeixCZBrKMvjnz867MtjeBIxmv4,24188
22
+ llms/extensions/app/db_manager.py,sha256=NcdOK_FzEmzCYEoQjdivZTrgJdFf9dGlAelJvP4VecA,7046
23
+ llms/extensions/app/requests.json,sha256=xMQ_FgMaBxbrCcTnsdkaBvufy40yFT7U1kR6nn_GaNE,264556
24
+ llms/extensions/app/threads.json,sha256=f_xPjkmY2OGbGnSXxVTcSGKRU-2rvfAXnHbf2pH1K5Q,741352
25
+ llms/extensions/app/__pycache__/__init__.cpython-314.pyc,sha256=mZAo7Asql7gWqNhT0x1f62I6KBM076BleSkUJIMsRPA,26938
26
+ llms/extensions/app/__pycache__/db.cpython-314.pyc,sha256=ZhUSgfpZ8CdyF7Z1fDLdzsBCEriTj37hlwTF3Oscn-o,35495
27
+ llms/extensions/app/__pycache__/db_manager.cpython-314.pyc,sha256=mS-NkAbnGYTDQfsKXZufkI9LnOBSWD5fYNMqTVjQrnE,11071
28
+ llms/extensions/app/ui/Recents.mjs,sha256=HT9R2IEus3dGEqtKPGrgX1eMp4EQ2j2jLwv-Fn1Us5E,9253
29
+ llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
30
+ llms/extensions/app/ui/threadStore.mjs,sha256=oCPPegkG3QHZIB82jwSCZ4d9dWEyhn1z1_Zo2dho4Bg,11588
31
+ llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
32
+ llms/extensions/core_tools/__init__.py,sha256=S9Pr08RtZtVpx8v6hyG_qVhfEJbT2JvmAD-AJTQZWmU,21468
33
+ llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc,sha256=O2aQ9pFmAP82JSl5l_rLvj0l-dR2dXJZu2RNaev2y_Y,32333
34
+ llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
35
+ llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js,sha256=FDwwFMKSVPNTHMML5tkCBQhLz8Ns_6b5sqRv1CpAviA,7123
36
+ llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js,sha256=b74rk8wXRNnhStHWE0SffhbfTCqihC9ljvwXq_Zi-FA,8544
37
+ llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js,sha256=a6nNlSi3Tn929LnOntBne_7XBX0areAFAYU2jP0OouM,3989
38
+ llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js,sha256=nSOhd_Hk0H46zDfCEP--TBwutNVbvlTBbT5609BNBAE,6815
39
+ llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js,sha256=Jj11L4ULIIkPBQb8snewlLR0E4aSpYtF17m7A-IKoAw,2358
40
+ llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js,sha256=oNLAGW2PSZHNWPMgSY967Olx5QLkgR7PWMta-OgwB8Y,1006
41
+ llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js,sha256=OvvPeINcm9w0LjmSxT2bdChnImE7saitydFA7chzfug,2509
42
+ llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js,sha256=W5xqADH-iVZB8ushmN8lkux2mmaF1rsQ8_m5Kngi4oY,3849
43
+ llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js,sha256=_df_U9DKeWxeN5LOtQY8hNBzW8rxmKHAbHiIDxxmSiI,3295
44
+ llms/extensions/core_tools/ui/codemirror/doc/docs.css,sha256=apFfZ7aIURmhMA5bPWqPasrUeNQQbyIj3RQ8A5cwV94,3315
45
+ llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff,sha256=4ppXym_xSqFSK1sYxUPXogFs3Xu6YyHWBN-jUZ8Osec,29448
46
+ llms/extensions/core_tools/ui/codemirror/lib/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
47
+ llms/extensions/core_tools/ui/codemirror/lib/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
48
+ llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js,sha256=BYoKZKIGseTbzBmm_6QBWoS7a_4T0LqFdovhHe9bTtI,37362
49
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html,sha256=K5xIggY1lgSYrcM9UhLcniq6G5zM_4Jl29cb_1YvHFQ,4668
50
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js,sha256=9do6jQ3GPCXs0-d8rPV89EMd8Lq_WU_TsZwrHT4imic,40636
51
+ llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html,sha256=38VEYk6oEcuTMvAP18XpxZmrcX5HOzewZGHZalYjt3E,1610
52
+ llms/extensions/core_tools/ui/codemirror/mode/python/python.js,sha256=GaWco4et2wTpUALJrb4rjCMUJ85JNprFNxB-MIimlHw,14984
53
+ llms/extensions/core_tools/ui/codemirror/theme/dracula.css,sha256=Av32BJYI3djQ189kA7blslEzB0Dfw5N3T2i7ZHJ7PG4,2042
54
+ llms/extensions/core_tools/ui/codemirror/theme/mocha.css,sha256=0Y1y9DUgzBSakbXep55HuqOYiPMC-YK3xjVQBiwUQ4g,2402
55
+ llms/extensions/gallery/README.md,sha256=zif27qiMef1dBboMEPvTJqPDnLvrqntraVSw8oQ-1RM,2985
56
+ llms/extensions/gallery/__init__.py,sha256=6YrgWsrfQXviFsJETFJxDlaEf0DAaPPBzokPxeK6AvU,1583
57
+ llms/extensions/gallery/db.py,sha256=hMsy0NMSKudA4HPUMvffMhXhOmqgVD31Ej_UmPrlbEg,11436
58
+ llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc,sha256=qVYj7_SMudEoxz7BJKsUN_BNEfm9COYKArAIrl30Ynw,3384
59
+ llms/extensions/gallery/__pycache__/db.cpython-314.pyc,sha256=Is7YTzoWVOp-2NnafjibWw7mbCnw2MejGZUrlcyCfeg,15708
60
+ llms/extensions/gallery/ui/index.mjs,sha256=1kPvtavUie0KtXCw3YjJpokJyl9zixAoEkcDfSYSfVk,28313
61
+ llms/extensions/katex/README.md,sha256=fD_0riNXrKW0SfehifIc3jnXKg9diQdlXVq5X_e1zTc,1473
62
+ llms/extensions/katex/__init__.py,sha256=CvEe9CPtzoANc4AFuxZTbrJZdggoWLuKnENKfEdncPQ,206
63
+ llms/extensions/katex/__pycache__/__init__.cpython-314.pyc,sha256=0oIxzaTcTIWR7KuMF_Wkpj-nlxJjVKKv021xXb74hPk,594
64
+ llms/extensions/katex/ui/README.md,sha256=Xkjgncuvv4WT4TzNX4muWHYKJOwZ-kSpNnyveLlJDNU,7268
65
+ llms/extensions/katex/ui/index.mjs,sha256=K54EGfcnQwvqmPiJAMgNplnq1t9AaCHsXvTcVBdbl_4,2829
66
+ llms/extensions/katex/ui/katex-swap.css,sha256=TFnBXg_P8omwxMkHbFFw7jRpnB11EGzV-z2NdUVi_x4,31769
67
+ llms/extensions/katex/ui/katex-swap.min.css,sha256=Fsj_aVHG8yCYtx4Zifq8j5Vl73MhOT-jUFEzrwwr-pM,23712
68
+ llms/extensions/katex/ui/katex.css,sha256=4UJ6yBPVaG2svf0OK6NvOK-NnIhG4M3i3B7L7VvKgmQ,31789
69
+ llms/extensions/katex/ui/katex.js,sha256=PWy90_IeY834xVXGb85bYKRc5gvaKq6dgIBNwjEPmJE,622633
70
+ llms/extensions/katex/ui/katex.min.css,sha256=4Yn9AjiBGYnDZG3Ovai8DPsex5G3nmDPnRjwWknIoBY,23732
71
+ llms/extensions/katex/ui/katex.min.js,sha256=a5CUQ-bI9uXSTMSHL-kJpUdwdiBHrpXj809V7C5vbDo,276705
72
+ llms/extensions/katex/ui/katex.min.mjs,sha256=KmfOVfgFWMddI3U_-lA5BJP_E0D_tnol5rdQNbUlKho,267755
73
+ llms/extensions/katex/ui/katex.mjs,sha256=1qAo5SYTN8yq6uIYB1alXX-BYw_JDnTSdOsCRNxPuJ8,610115
74
+ llms/extensions/katex/ui/contrib/auto-render.js,sha256=H1SS5odSobH7zVAIQModAZHCYTH9w2OBtJOgLGuNS88,10508
75
+ llms/extensions/katex/ui/contrib/auto-render.min.js,sha256=u1PrlTOUUxquNv3VNwZcQkTrhUKQGjzpFGAdkyZ1uKw,3467
76
+ llms/extensions/katex/ui/contrib/auto-render.mjs,sha256=QtMkCZDUVDbW3U37Nud5JEjNwrYCxHrEJP0Jsek9vf4,6840
77
+ llms/extensions/katex/ui/contrib/copy-tex.js,sha256=Kgy7CBbqP6RViyyBD4M_2cLik3CImMSh5ZBhfJqyBOs,4507
78
+ llms/extensions/katex/ui/contrib/copy-tex.min.js,sha256=B3cK-QlDod4aEBB5S8eManNG1G1I-2PjXMdrp2uCdgQ,1673
79
+ llms/extensions/katex/ui/contrib/copy-tex.mjs,sha256=0De3xM3HNCAoWlgOW4-ctEGtZ-Zh_RrTHdRarc8Ee_U,3640
80
+ llms/extensions/katex/ui/contrib/mathtex-script-type.js,sha256=ZCkQ0MIYkiD02D9XnYxhHvDC10xDDFxfXQrKhhxcaxI,4207
81
+ llms/extensions/katex/ui/contrib/mathtex-script-type.min.js,sha256=B5myi4vIBiH8htnO5Fz9HKSZ9309bXGw7jBxWPw7ULk,1290
82
+ llms/extensions/katex/ui/contrib/mathtex-script-type.mjs,sha256=V_UZsiMDB8dNCAIPUshZyWn1Un60DSS7irPiFngI1cY,751
83
+ llms/extensions/katex/ui/contrib/mhchem.js,sha256=ra4CiB7OdQzkMKpbJQxU4j4OPRhUx_80jftes02vaHo,78705
84
+ llms/extensions/katex/ui/contrib/mhchem.min.js,sha256=n4fl6cOEoWBHLQBFA1qGQfYBM1jt2z7OcIY0pQ-UakA,33712
85
+ llms/extensions/katex/ui/contrib/mhchem.mjs,sha256=xdS2inkhwhj_3PTXwXkA14Ove0hDBROBDLFOeRpUq7Q,75577
86
+ llms/extensions/katex/ui/contrib/render-a11y-string.js,sha256=pfoN2Rsz0kzmtqstQTKCWEKqKGwUsED2aNzZJxdJc4c,23938
87
+ llms/extensions/katex/ui/contrib/render-a11y-string.min.js,sha256=eQIPbKYpwHvd8iccbQV-jlXo4lFCikk96DnIlPcTFg0,8454
88
+ llms/extensions/katex/ui/contrib/render-a11y-string.mjs,sha256=Xfgg3ZN2vSPvQk5c_EVQXVeuZG-wxVM3WOetUeBIiTs,20283
89
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf,sha256=aFNIQLz90r_7bw6N60hoTdAefwTqKBMmdXevuQbeHRM,63632
90
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff,sha256=MNqR6EyJP4deJSaJ-uvcWQsocRReitx_mp1NvYzgslE,33516
91
+ llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2,sha256=DN04fJWQoan5eUVgAi27WWVKfYbxh6oMgUla1C06cwg,28076
92
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf,sha256=B9jjA85PwStLtU8QBBcN0ZCh89tF1AD-aAYN8-CJcmg,12368
93
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff,sha256=Gua9dHVZDpfn8UWongnM3jIvemvAuRYHsci47igpD-0,7716
94
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2,sha256=3ncB5Czx9M8LdmwD-yeXcgfu4vT9XXb6ghiEBtpD6kw,6912
95
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf,sha256=7Qt0Ny_u_LucBmay4hDaN7fkn6f7vz7rEdtfaT2s-7c,12344
96
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff,sha256=M5jdAjAlV6eT8oY_iOAtls4Q3yq_-gfI6fqQd1EW5lw,7656
97
+ llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2,sha256=XVPnCtYHwjUhYt7J4JI_tU7Nr6zL9gTNjc99APrLmJs,6908
98
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf,sha256=kWPfnHEiQy5klbQin6kHHPmuhqdYrl78SSTsLhptvOE,19584
99
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff,sha256=m-fOuIAEq4rRJAgiRvv8ykCR42OF1Oxu0d9nN12tUPs,13296
100
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2,sha256=dERO_Vk8AF4_RXO0RSRwTArwqTf-kRzKnpQGjQ0UDT8,11348
101
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf,sha256=Hm-VeekOLKw3-PYKWXxDbgdcEUOFZSt8vrDewEISkbM,19572
102
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff,sha256=Xih1O-cX2sl_VZ9JvBC-nPPBJN3KvaZlnRHLaP68ZGM,13208
103
+ llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2,sha256=UYFNJw0G_wJV26B5mZT6TYyE0R8JlR1HWV9Kux82Atw,11316
104
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf,sha256=E4rCjRZjswN-nF9SNx-lxj2DJPSjjSLNVz5uo6P9DPg,51336
105
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff,sha256=x2xdaWKX1RucsWOcfaQzTw597IG0KxEhO14l72cbuCI,29912
106
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2,sha256=D2DRuJeTjskYyM4HMJJBG6-UOPZzlGVpP_GLD50gsCE,25324
107
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf,sha256=cO4fZKIPIEjCGUDvRtAUT9IVuqlTymmv0eMemFRPcI8,32968
108
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff,sha256=pvfsDYRqx62XWtuJWcN-1JuUrLxK5DbbnOniAofkpkw,19412
109
+ llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2,sha256=mc1Co8By2Rjy9EmEqAfPeqFuE1Rf0IdfwHxsZfmecVs,16780
110
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf,sha256=DYWufMMPI3kKfxpYxKES_cqKrnaba6EUKa8dmLG2yzo,33580
111
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff,sha256=8dbvhvOxGlKL1RhRmb0kQ-yysN6tltiGdLWiwSviS98,19676
112
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2,sha256=l0ecpszpBqvJYeyslvql-couYbjnZw1HWCa83umnwmc,16988
113
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf,sha256=0DMvUoaDcP2Drn-kZHD5DI8uqy_PErxPiAgLNAyVqDA,53580
114
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff,sha256=xjaNh-iho6XTN2I9g9jcS4aPJCqa1HYjfW-NHg8WjNw,30772
115
+ llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2,sha256=wjQs2Lhp4BdSqTIdwXIT_EDU0Ex5aIwdQ_LPMWq9eGY,26272
116
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf,sha256=-Td6sCcc2lmvJLz_vUak0MijVy_6_bs43irV6nsNXuU,31196
117
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff,sha256=hQwK9cIjhJf-uvXkYdiAv0WMNB9C9PMw8bGrVpixmY4,18668
118
+ llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2,sha256=3Ec0TbtstbZVyEYNVh9N9fUBuQyAStPGzsZf4yI1GrE,16400
119
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf,sha256=CM6Y5RsE1YlFowHmOeAraZivKf39Yae4r90Hu_xHnUo,31308
120
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff,sha256=io0kRYE3GRK48_WiPiQ3yypZzZvK67A0bnIsBXN6JXE,18748
121
+ llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2,sha256=evWMXsjxMqLd3pAnxteBTezOTTuCKhEZKkKiDi6XMmQ,16440
122
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf,sha256=Hs4D95-VJ31X3H9rQ1p04TebDUYQSoUwKGtg_0k2nqA,24504
123
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff,sha256=7OA8_YPiLCEs3vZv64RC0loIO-uYjbPxiD8_lzjXULo,14408
124
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2,sha256=6ZrlEUS_EjLvzBv-Wt02JixoZrD6qyT6dXQOG5hXemI,12216
125
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf,sha256=OTHdgfrthroCG7K73Db1vtmjjWtPQHespZsmWqGwIIM,22364
126
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff,sha256=ke5nUAzAEpqgrOOsXGH_FpIQLw8x0CtpNH-6Ndy3W_I,14112
127
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2,sha256=ALJqyCXiCVBWOW4FU7isJtP4rRWMOCbii0xFs4XEcUo,12028
128
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf,sha256=826ol-GfSi5XHR6QDk43EOQ43rBahCSGBFugo-YWpK0,19436
129
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff,sha256=EeTcimRx_21u5WHVPRD96PdInnmCV_9EnF03wZdDVgU,12316
130
+ llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2,sha256=aOjHPvQq_TzOxYvw-6MCzORIk45_wCCl4x-KlS7uE0I,10344
131
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf,sha256=HGfwaP6ouwm_CZwIixz2S9J1Fqbgf0aENEhzVku2amc,16648
132
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff,sha256=2WzfKzvdTWSo_V90pMRn8SOopzkxzUNYifCP-vm_lHo,10588
133
+ llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2,sha256=A21OlRSbaf-bzAzVV3Hv6yX_o5Ryk-aazXjVrDKMaEs,9644
134
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf,sha256=lbbS8aUBc7_tuMY-HRyZsQQn0KTfQgHLRFE7ImlRois,12228
135
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff,sha256=yUPMmGOE9Z6GvqX9fcUKnE3-Vnp8BetA1nkHIN6tl8k,6496
136
+ llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2,sha256=a0fEAWa22-IaXfyncYQT8hR_0jmb4bpgXYrTnO3yXf4,5468
137
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf,sha256=prIJn7VVxg46DbOgiELr8dcyxutOS_RJE2E77U_E45s,11508
138
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff,sha256=IBTFI8MhC8wWZkjE1MxX8Ft0ffB6JCd79xxR5n3Hnj0,6188
139
+ llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2,sha256=0ExUIZ-ersbU1P1C37KHhZdaR5TWsvxx5Wa5zW24Qt0,5208
140
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf,sha256=UA4E1U8NUWZjMsnSCJqoA74iqoeOylOeWfpTxuUisII,7588
141
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff,sha256=ara2Lpti2uLADdkPeRvRCVC-Dsw0kNfWBF9Rwuj-CUk,4420
142
+ llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2,sha256=c9WRJxsWBJYMsQu5D-4CFnCvcpcBfg6YSAszLRH1GZU,3624
143
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf,sha256=xkc2fR3U4WJGhxfQIOH8Dx3Fwm6_3_vlUmFxO_iMWHc,10364
144
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff,sha256=mfnGdQtInJRivwSQC9P5Od-bgpM52qqqme9Ulc3d6lg,5980
145
+ llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2,sha256=pK99QURAocF5CCXPtwDPnPQ7DyxLBPDrxSMBGtmFPsA,4928
146
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf,sha256=8B8-h9nGphwMCBzrV3q9hk6wCmEvesFiDdaRX60u9ao,27556
147
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff,sha256=4U_tArGrp86fWv1YRLXQMhsiNR_rxyDg3ouHI1J2Cfc,16028
148
+ llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2,sha256=cdUX1ngneHz6vfGGkUzDNY7aU543kxlB8rL9SiH2jAs,13568
149
+ llms/extensions/providers/__init__.py,sha256=b20NLETAlDFnKQfGj0YviUA0L0EvDpYJQFK_W-A2_WU,419
150
+ llms/extensions/providers/anthropic.py,sha256=znBBakNlNEHKe9wziCVnhJakUlMIOx_jhrKwN9L1E6M,10256
151
+ llms/extensions/providers/chutes.py,sha256=mdPFwPyK1j2k3HbD-44LD20XYicUZDdyG4RFI4DzmbM,6317
152
+ llms/extensions/providers/google.py,sha256=khH8F9uQueHdqMdMx9SvnD1AbBUp_KSZBVwH1up_E6o,19344
153
+ llms/extensions/providers/nvidia.py,sha256=AokVo18QBqB9xAbIWkcum4SefrwHflhtoIxGWuBycIM,4366
154
+ llms/extensions/providers/openai.py,sha256=qC5o-On3enNS_zSNNfGNHzDa0-Ca50Moz-7kilxd0q0,6234
155
+ llms/extensions/providers/openrouter.py,sha256=gVUIa1DhbrEG7S8_-Qkxa0kdtHT8Doj3El0DO-q_tcQ,3253
156
+ llms/extensions/providers/__pycache__/__init__.cpython-314.pyc,sha256=_V6L2wMvy-HQMmz7bvnegp4NjxmTgP7_AR-d9SUN3dc,797
157
+ llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc,sha256=93ULyorNB8bBHRGOu-38HXy4BnkuDKJkOm_Vo6PP62g,10933
158
+ llms/extensions/providers/__pycache__/chutes.cpython-314.pyc,sha256=QH2fiGb6VueqWNjN0RwizVpPOeqdN78s2rp_WoR0DrA,7367
159
+ llms/extensions/providers/__pycache__/google.cpython-314.pyc,sha256=STxidyM6xp0vwkCLO29wDTIw1jXluDBIB4KLNKf4c14,17473
160
+ llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc,sha256=UOsgdqA2-9E5jVo2CbytViJxrk5AEdXJvH9X0gmK_mA,6216
161
+ llms/extensions/providers/__pycache__/openai.cpython-314.pyc,sha256=mu8QC52_OUwtFX89FN_WXZgkgoFglvF1gDukN4ge8Rk,8735
162
+ llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc,sha256=LknnfQPVrXB2-7GCKVHoXIk6mW2ghRlQmn8piwQCv3I,5335
163
+ llms/extensions/system_prompts/README.md,sha256=ayr18lnSsGp62bunC6kxkvcSvZki775rbZ-8VoMDQEc,597
164
+ llms/extensions/system_prompts/__init__.py,sha256=TZy1CS2dPkBNBA_Ovf9BlVetZqTt2NgnsrZi6Mtg_C0,1535
165
+ llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc,sha256=mftPdTu1qDLxifGSy9TkAAYPXxOkuNv7dUmQoZBC5Uk,2168
166
+ llms/extensions/system_prompts/ui/index.mjs,sha256=_pVCreAebSzE9dzcHF2kiYODwP-fDHCqtUQB-X5Io9Q,12107
167
+ llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdoYDrVzfyc8TO5OaotI,128489
168
+ llms/extensions/tools/__init__.py,sha256=yfIK7dVqYiZGX5VeJ3x7HQWLPQfuPqeNYJsd0lpZUM4,120
169
+ llms/extensions/tools/__pycache__/__init__.cpython-314.pyc,sha256=3H5i6ooI1LCCdVjZPDBteU2Ov6nYSeLAk9kUl6F9pZg,641
170
+ llms/extensions/tools/ui/index.mjs,sha256=Nu69U6odCUh8uu1i8d5f8ryO4Lj_OFbPX2LnVyYu1fk,9602
171
+ llms/ui/App.mjs,sha256=zU-GtbcSMREizjUS9nWiMK6m_oT14MNJ-p_RCz2RVqA,7445
172
+ llms/ui/ai.mjs,sha256=9SNPim1QDJYdtSPlMJ15YgQ6uBVqshCzu7eje8AKHR0,6540
173
+ llms/ui/app.css,sha256=VcyYn6-qinFH7iOkIxUb5dmPDjLDcDBvgEOaRaeyg1E,173909
174
+ llms/ui/ctx.mjs,sha256=UTdIvJUPoD7bWuAX8ju2jA8PDTP_wfVccyVoXauArmo,11174
175
+ llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
176
+ llms/ui/index.mjs,sha256=j2rkXwpxPpBsurWLvvN6a25cVu7r9s9avP9ozKOpzMA,4253
177
+ llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
178
+ llms/ui/tailwind.input.css,sha256=fJInSAoAoF-fhLiWFlocuP5i3b4eWp8grIfG6LyvtVw,15785
179
+ llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
180
+ llms/ui/utils.mjs,sha256=75Hsj04Zx-IJe4l682qaUTePAx5WT-hyjFUyW8pFwnU,6445
181
+ llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
182
+ llms/ui/lib/charts.mjs,sha256=OPFAifcA4MPRv8pw6I7glVh7Xccv8guio0k35zPBDIY,926
183
+ llms/ui/lib/color.js,sha256=DDG7Pr-qzJHTPISZNSqP_qJR8UflKHEc_56n6xrBugQ,8273
184
+ llms/ui/lib/highlight.min.mjs,sha256=sG7wq8bF-IKkfie7S4QSyh5DdHBRf0NqQxMOEH8-MT0,127458
185
+ llms/ui/lib/idb.min.mjs,sha256=CeTXyV4I_pB5vnibvJuyXdMs0iVF2ZL0Z7cdm3w_QaI,3853
186
+ llms/ui/lib/marked.min.mjs,sha256=QRHb_VZugcBJRD2EP6gYlVFEsJw5C2fQ8ImMf_pA2_s,39488
187
+ llms/ui/lib/servicestack-client.mjs,sha256=UVafVbzhJ_0N2lzv7rlzIbzwnWpoqXxGk3N3FSKgOOc,54534
188
+ llms/ui/lib/servicestack-vue.mjs,sha256=4XxQLaKm26aexbY7lYTSMRmjZmBRzZgq7F8GZquuGrs,216947
189
+ llms/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
190
+ llms/ui/lib/vue.min.mjs,sha256=T1TVu9SFEoLArPLKKEp6gsj_eScmHl5TkUebxGK6ldk,166282
191
+ llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
192
+ llms/ui/modules/layout.mjs,sha256=ft5dOT-fBegSmSPQKnktHKfpbmNFan8ZN44z25T8ig8,10892
193
+ llms/ui/modules/model-selector.mjs,sha256=TrXxOIeNgibNMu_6M-wROjQgmHJPrVxH404v1_kXF4c,67486
194
+ llms/ui/modules/chat/ChatBody.mjs,sha256=0G2E82RnlRxVjW6xWRFXWJF8vjMZJfdeddcE66M4Wxg,42289
195
+ llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
196
+ llms/ui/modules/chat/index.mjs,sha256=sTKf7pwCkyu_Ls--pE3yrr2DSztuKQtLT7kFffaHIVU,33678
197
+ llms_py-3.0.0.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
198
+ llms_py-3.0.0.dist-info/METADATA,sha256=j87bFGNDEwUlBBeq0VKHUeZJCdwZ3csVubY54fwI7VY,2191
199
+ llms_py-3.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
200
+ llms_py-3.0.0.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
201
+ llms_py-3.0.0.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
202
+ llms_py-3.0.0.dist-info/RECORD,,
llms/ui/Avatar.mjs DELETED
@@ -1,85 +0,0 @@
1
- import { computed, inject, ref, onMounted, onUnmounted } from "vue"
2
-
3
- export default {
4
- template:`
5
- <div v-if="$ai.auth?.profileUrl" class="relative" ref="avatarContainer">
6
- <img
7
- @click.stop="toggleMenu"
8
- :src="$ai.auth.profileUrl"
9
- :title="authTitle"
10
- class="size-8 rounded-full cursor-pointer hover:ring-2 hover:ring-gray-300"
11
- />
12
- <div
13
- v-if="showMenu"
14
- @click.stop
15
- class="absolute right-0 mt-2 w-48 bg-white dark:bg-gray-800 rounded-md shadow-lg py-1 z-50 border border-gray-200 dark:border-gray-700"
16
- >
17
- <div class="px-4 py-2 text-sm text-gray-700 dark:text-gray-300 border-b border-gray-200 dark:border-gray-700">
18
- <div class="font-medium whitespace-nowrap overflow-hidden text-ellipsis">{{ $ai.auth.displayName || $ai.auth.userName }}</div>
19
- <div class="text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap overflow-hidden text-ellipsis">{{ $ai.auth.email }}</div>
20
- </div>
21
- <button type="button"
22
- @click="handleLogout"
23
- class="w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 flex items-center whitespace-nowrap"
24
- >
25
- <svg class="w-4 h-4 mr-2 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
26
- <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1"></path>
27
- </svg>
28
- Sign Out
29
- </button>
30
- </div>
31
- </div>
32
- `,
33
- setup() {
34
- const ai = inject('ai')
35
- const showMenu = ref(false)
36
- const avatarContainer = ref(null)
37
-
38
- const authTitle = computed(() => {
39
- if (!ai.auth) return ''
40
- const { userId, userName, displayName, bearerToken, roles } = ai.auth
41
- const name = userName || displayName
42
- const prefix = roles && roles.includes('Admin') ? 'Admin' : 'Name'
43
- const sb = [
44
- name ? `${prefix}: ${name}` : '',
45
- `API Key: ${bearerToken}`,
46
- `${userId}`,
47
- ]
48
- return sb.filter(x => x).join('\n')
49
- })
50
-
51
- function toggleMenu() {
52
- showMenu.value = !showMenu.value
53
- }
54
-
55
- async function handleLogout() {
56
- showMenu.value = false
57
- await ai.signOut()
58
- // Reload the page to show sign-in screen
59
- window.location.reload()
60
- }
61
-
62
- // Close menu when clicking outside
63
- const handleClickOutside = (event) => {
64
- if (showMenu.value && avatarContainer.value && !avatarContainer.value.contains(event.target)) {
65
- showMenu.value = false
66
- }
67
- }
68
-
69
- onMounted(() => {
70
- document.addEventListener('click', handleClickOutside)
71
- })
72
-
73
- onUnmounted(() => {
74
- document.removeEventListener('click', handleClickOutside)
75
- })
76
-
77
- return {
78
- authTitle,
79
- handleLogout,
80
- showMenu,
81
- toggleMenu,
82
- avatarContainer,
83
- }
84
- }
85
- }