llms-py 2.0.35__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.
- llms/__pycache__/__init__.cpython-312.pyc +0 -0
- llms/__pycache__/__init__.cpython-313.pyc +0 -0
- llms/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/__pycache__/__main__.cpython-312.pyc +0 -0
- llms/__pycache__/__main__.cpython-314.pyc +0 -0
- llms/__pycache__/llms.cpython-312.pyc +0 -0
- llms/__pycache__/main.cpython-312.pyc +0 -0
- llms/__pycache__/main.cpython-313.pyc +0 -0
- llms/__pycache__/main.cpython-314.pyc +0 -0
- llms/__pycache__/plugins.cpython-314.pyc +0 -0
- llms/{ui/Analytics.mjs → extensions/analytics/ui/index.mjs} +154 -238
- llms/extensions/app/README.md +20 -0
- llms/extensions/app/__init__.py +530 -0
- llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
- llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
- llms/extensions/app/db.py +644 -0
- llms/extensions/app/db_manager.py +195 -0
- llms/extensions/app/requests.json +9073 -0
- llms/extensions/app/threads.json +15290 -0
- llms/{ui → extensions/app/ui}/Recents.mjs +91 -65
- llms/{ui/Sidebar.mjs → extensions/app/ui/index.mjs} +124 -58
- llms/extensions/app/ui/threadStore.mjs +411 -0
- llms/extensions/core_tools/CALCULATOR.md +32 -0
- llms/extensions/core_tools/__init__.py +598 -0
- llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
- llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
- llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
- llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
- llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +344 -0
- llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +9884 -0
- llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
- llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
- llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
- llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
- llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
- llms/extensions/core_tools/ui/index.mjs +650 -0
- llms/extensions/gallery/README.md +61 -0
- llms/extensions/gallery/__init__.py +61 -0
- llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
- llms/extensions/gallery/db.py +298 -0
- llms/extensions/gallery/ui/index.mjs +482 -0
- llms/extensions/katex/README.md +39 -0
- llms/extensions/katex/__init__.py +6 -0
- llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/katex/ui/README.md +125 -0
- llms/extensions/katex/ui/contrib/auto-render.js +338 -0
- llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
- llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
- llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
- llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
- llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
- llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
- llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
- llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
- llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
- llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
- llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- llms/extensions/katex/ui/index.mjs +92 -0
- llms/extensions/katex/ui/katex-swap.css +1230 -0
- llms/extensions/katex/ui/katex-swap.min.css +1 -0
- llms/extensions/katex/ui/katex.css +1230 -0
- llms/extensions/katex/ui/katex.js +19080 -0
- llms/extensions/katex/ui/katex.min.css +1 -0
- llms/extensions/katex/ui/katex.min.js +1 -0
- llms/extensions/katex/ui/katex.min.mjs +1 -0
- llms/extensions/katex/ui/katex.mjs +18547 -0
- llms/extensions/providers/__init__.py +18 -0
- llms/extensions/providers/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/chutes.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/google.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/openai.cpython-314.pyc +0 -0
- llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
- llms/extensions/providers/anthropic.py +229 -0
- llms/extensions/providers/chutes.py +155 -0
- llms/extensions/providers/google.py +378 -0
- llms/extensions/providers/nvidia.py +105 -0
- llms/extensions/providers/openai.py +156 -0
- llms/extensions/providers/openrouter.py +72 -0
- llms/extensions/system_prompts/README.md +22 -0
- llms/extensions/system_prompts/__init__.py +45 -0
- llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/system_prompts/ui/index.mjs +280 -0
- llms/extensions/system_prompts/ui/prompts.json +1067 -0
- llms/extensions/tools/__init__.py +5 -0
- llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
- llms/extensions/tools/ui/index.mjs +204 -0
- llms/index.html +35 -77
- llms/llms.json +357 -1186
- llms/main.py +2349 -591
- llms/providers-extra.json +356 -0
- llms/providers.json +1 -0
- llms/ui/App.mjs +151 -60
- llms/ui/ai.mjs +132 -60
- llms/ui/app.css +2173 -161
- llms/ui/ctx.mjs +365 -0
- llms/ui/index.mjs +129 -0
- llms/ui/lib/charts.mjs +9 -13
- llms/ui/lib/servicestack-vue.mjs +3 -3
- llms/ui/lib/vue.min.mjs +10 -9
- llms/ui/lib/vue.mjs +1796 -1635
- llms/ui/markdown.mjs +18 -7
- llms/ui/modules/chat/ChatBody.mjs +691 -0
- llms/ui/{SettingsDialog.mjs → modules/chat/SettingsDialog.mjs} +9 -9
- llms/ui/modules/chat/index.mjs +828 -0
- llms/ui/modules/layout.mjs +243 -0
- llms/ui/modules/model-selector.mjs +851 -0
- llms/ui/tailwind.input.css +496 -80
- llms/ui/utils.mjs +161 -93
- {llms_py-2.0.35.dist-info → llms_py-3.0.0.dist-info}/METADATA +1 -1
- llms_py-3.0.0.dist-info/RECORD +202 -0
- llms/ui/Avatar.mjs +0 -85
- llms/ui/Brand.mjs +0 -52
- llms/ui/ChatPrompt.mjs +0 -590
- llms/ui/Main.mjs +0 -823
- llms/ui/ModelSelector.mjs +0 -78
- llms/ui/OAuthSignIn.mjs +0 -92
- llms/ui/ProviderIcon.mjs +0 -30
- llms/ui/ProviderStatus.mjs +0 -105
- llms/ui/SignIn.mjs +0 -64
- llms/ui/SystemPromptEditor.mjs +0 -31
- llms/ui/SystemPromptSelector.mjs +0 -56
- llms/ui/Welcome.mjs +0 -8
- llms/ui/threadStore.mjs +0 -563
- llms/ui.json +0 -1069
- llms_py-2.0.35.dist-info/RECORD +0 -48
- {llms_py-2.0.35.dist-info → llms_py-3.0.0.dist-info}/WHEEL +0 -0
- {llms_py-2.0.35.dist-info → llms_py-3.0.0.dist-info}/entry_points.txt +0 -0
- {llms_py-2.0.35.dist-info → llms_py-3.0.0.dist-info}/licenses/LICENSE +0 -0
- {llms_py-2.0.35.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 {
|
|
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
|
|
34
|
-
return
|
|
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
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
63
|
-
|
|
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 =
|
|
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
|
|
112
|
+
return currFmt2.format(parseFloat(cost))
|
|
71
113
|
}
|
|
72
|
-
export function
|
|
114
|
+
export function tokensTitle(usage) {
|
|
73
115
|
let title = []
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
79
|
-
|
|
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
|
-
|
|
82
|
-
|
|
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
|
-
|
|
85
|
-
title
|
|
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
|
-
|
|
88
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
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
|
-
|
|
136
|
-
div.appendChild(label)
|
|
137
|
-
div.appendChild(btn)
|
|
138
|
-
pre.insertBefore(div, code)
|
|
139
|
-
})
|
|
140
|
-
}
|
|
179
|
+
}
|
|
141
180
|
|
|
142
|
-
|
|
143
|
-
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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
|
+
|
|
@@ -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
|
-
}
|