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/ModelSelector.mjs
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { ref, onMounted, onUnmounted } from "vue"
|
|
2
|
-
import ProviderStatus from "./ProviderStatus.mjs"
|
|
3
|
-
import ProviderIcon from "./ProviderIcon.mjs"
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
components: {
|
|
7
|
-
ProviderStatus,
|
|
8
|
-
ProviderIcon,
|
|
9
|
-
},
|
|
10
|
-
template:`
|
|
11
|
-
<!-- Model Selector -->
|
|
12
|
-
<div class="pl-1 flex space-x-2">
|
|
13
|
-
<Autocomplete ref="refSelector" id="model" :options="models" label=""
|
|
14
|
-
:modelValue="modelValue" @update:modelValue="$emit('update:modelValue', $event)"
|
|
15
|
-
class="w-72 xl:w-84"
|
|
16
|
-
:match="(x, value) => x.id.toLowerCase().includes(value.toLowerCase())"
|
|
17
|
-
placeholder="Select Model...">
|
|
18
|
-
<template #item="{ id, provider, provider_model, pricing }">
|
|
19
|
-
<div :key="id + provider + provider_model"
|
|
20
|
-
class="group truncate max-w-68 xl:max-w-72 flex justify-between">
|
|
21
|
-
<span :title="id">{{id}}</span>
|
|
22
|
-
<div class="hidden md:flex items-center space-x-1">
|
|
23
|
-
<span v-if="pricing && (parseFloat(pricing.input) == 0 && parseFloat(pricing.input) == 0)">
|
|
24
|
-
<span class="text-xs text-gray-500 dark:text-gray-400" title="Free to use">FREE</span>
|
|
25
|
-
</span>
|
|
26
|
-
<span v-else-if="pricing" class="text-xs text-gray-500 dark:text-gray-400"
|
|
27
|
-
:title="'Estimated Cost per token: ' + pricing.input + ' input | ' + pricing.output + ' output'">
|
|
28
|
-
{{tokenPrice(pricing.input)}}
|
|
29
|
-
·
|
|
30
|
-
{{tokenPrice(pricing.output)}} M
|
|
31
|
-
</span>
|
|
32
|
-
<span class="min-w-6" :title="provider_model + ' from ' + provider">
|
|
33
|
-
<ProviderIcon class="hidden xl:inline" :provider="provider" />
|
|
34
|
-
</span>
|
|
35
|
-
</div>
|
|
36
|
-
</div>
|
|
37
|
-
</template>
|
|
38
|
-
</Autocomplete>
|
|
39
|
-
<ProviderStatus @updated="$emit('updated', $event)" />
|
|
40
|
-
</div>
|
|
41
|
-
`,
|
|
42
|
-
emits: ['updated', 'update:modelValue'],
|
|
43
|
-
props: {
|
|
44
|
-
models: Array,
|
|
45
|
-
modelValue: String,
|
|
46
|
-
},
|
|
47
|
-
setup() {
|
|
48
|
-
|
|
49
|
-
const numFmt = new Intl.NumberFormat(undefined,{style:'currency',currency:'USD'})
|
|
50
|
-
|
|
51
|
-
function tokenPrice(price) {
|
|
52
|
-
if (!price) return ''
|
|
53
|
-
var ret = numFmt.format(parseFloat(price) * 1_000_000)
|
|
54
|
-
return ret.endsWith('.00') ? ret.slice(0, -3) : ret
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
const refSelector = ref()
|
|
58
|
-
|
|
59
|
-
function collapse(e) {
|
|
60
|
-
// call toggle when clicking outside of the Autocomplete component
|
|
61
|
-
if (refSelector.value && !refSelector.value.$el.contains(e.target)) {
|
|
62
|
-
refSelector.value.toggle(false)
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
onMounted(() => {
|
|
67
|
-
document.addEventListener('click', collapse)
|
|
68
|
-
})
|
|
69
|
-
onUnmounted(() => {
|
|
70
|
-
document.removeEventListener('click', collapse)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
refSelector,
|
|
75
|
-
tokenPrice,
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
llms/ui/OAuthSignIn.mjs
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
import { inject, ref, onMounted } from "vue"
|
|
2
|
-
import Welcome from './Welcome.mjs'
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
components: {
|
|
6
|
-
Welcome,
|
|
7
|
-
},
|
|
8
|
-
template: `
|
|
9
|
-
<div class="min-h-full -mt-36 flex flex-col justify-center sm:px-6 lg:px-8">
|
|
10
|
-
<div class="sm:mx-auto sm:w-full sm:max-w-md text-center">
|
|
11
|
-
<Welcome />
|
|
12
|
-
</div>
|
|
13
|
-
<div class="sm:mx-auto sm:w-full sm:max-w-md">
|
|
14
|
-
<div v-if="errorMessage" class="mb-3 bg-red-50 dark:bg-red-900/30 border border-red-200 dark:border-red-800 text-red-800 dark:text-red-200 rounded-lg px-4 py-3">
|
|
15
|
-
<div class="flex items-start space-x-2">
|
|
16
|
-
<div class="flex-1">
|
|
17
|
-
<div class="text-base font-medium">{{ errorMessage }}</div>
|
|
18
|
-
</div>
|
|
19
|
-
<button type="button"
|
|
20
|
-
@click="errorMessage = null"
|
|
21
|
-
class="text-red-400 dark:text-red-300 hover:text-red-600 dark:hover:text-red-100 flex-shrink-0"
|
|
22
|
-
>
|
|
23
|
-
<svg class="w-4 h-4" fill="currentColor" viewBox="0 0 20 20">
|
|
24
|
-
<path fill-rule="evenodd" d="M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z" clip-rule="evenodd"></path>
|
|
25
|
-
</svg>
|
|
26
|
-
</button>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
<div class="py-8 px-4 sm:px-10">
|
|
30
|
-
<div class="space-y-4">
|
|
31
|
-
<button
|
|
32
|
-
type="button"
|
|
33
|
-
@click="signInWithGitHub"
|
|
34
|
-
class="w-full inline-flex items-center justify-center px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-md shadow-sm text-base font-medium text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-500 transition-colors"
|
|
35
|
-
>
|
|
36
|
-
<svg class="w-6 h-6 mr-3" fill="currentColor" viewBox="0 0 24 24" aria-hidden="true">
|
|
37
|
-
<path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" />
|
|
38
|
-
</svg>
|
|
39
|
-
Sign in with GitHub
|
|
40
|
-
</button>
|
|
41
|
-
</div>
|
|
42
|
-
</div>
|
|
43
|
-
</div>
|
|
44
|
-
</div>
|
|
45
|
-
`,
|
|
46
|
-
emits: ['done'],
|
|
47
|
-
setup(props, { emit }) {
|
|
48
|
-
const ai = inject('ai')
|
|
49
|
-
const errorMessage = ref(null)
|
|
50
|
-
|
|
51
|
-
function signInWithGitHub() {
|
|
52
|
-
// Redirect to GitHub OAuth endpoint
|
|
53
|
-
window.location.href = '/auth/github'
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Check for session token in URL (after OAuth callback redirect)
|
|
57
|
-
onMounted(async () => {
|
|
58
|
-
const urlParams = new URLSearchParams(window.location.search)
|
|
59
|
-
const sessionToken = urlParams.get('session')
|
|
60
|
-
|
|
61
|
-
if (sessionToken) {
|
|
62
|
-
try {
|
|
63
|
-
// Validate session with server
|
|
64
|
-
const response = await ai.get(`/auth/session?session=${sessionToken}`)
|
|
65
|
-
|
|
66
|
-
if (response.ok) {
|
|
67
|
-
const sessionData = await response.json()
|
|
68
|
-
|
|
69
|
-
// Clean up URL
|
|
70
|
-
const url = new URL(window.location.href)
|
|
71
|
-
url.searchParams.delete('session')
|
|
72
|
-
window.history.replaceState({}, '', url.toString())
|
|
73
|
-
|
|
74
|
-
// Emit done event with session data
|
|
75
|
-
emit('done', sessionData)
|
|
76
|
-
} else {
|
|
77
|
-
errorMessage.value = 'Failed to validate session'
|
|
78
|
-
}
|
|
79
|
-
} catch (error) {
|
|
80
|
-
console.error('Session validation error:', error)
|
|
81
|
-
errorMessage.value = 'Failed to validate session'
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
return {
|
|
87
|
-
signInWithGitHub,
|
|
88
|
-
errorMessage,
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
llms/ui/ProviderIcon.mjs
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
template:`
|
|
3
|
-
<svg v-if="matches(['openrouter'])" class="size-5" xmlns="http://www.w3.org/2000/svg" fill="#71717A" fill-rule="evenodd" viewBox="0 0 24 24"><path d="M16.804 1.957l7.22 4.105v.087L16.73 10.21l.017-2.117-.821-.03c-1.059-.028-1.611.002-2.268.11-1.064.175-2.038.577-3.147 1.352L8.345 11.03c-.284.195-.495.336-.68.455l-.515.322-.397.234.385.23.53.338c.476.314 1.17.796 2.701 1.866 1.11.775 2.083 1.177 3.147 1.352l.3.045c.694.091 1.375.094 2.825.033l.022-2.159 7.22 4.105v.087L16.589 22l.014-1.862-.635.022c-1.386.042-2.137.002-3.138-.162-1.694-.28-3.26-.926-4.881-2.059l-2.158-1.5a21.997 21.997 0 00-.755-.498l-.467-.28a55.927 55.927 0 00-.76-.43C2.908 14.73.563 14.116 0 14.116V9.888l.14.004c.564-.007 2.91-.622 3.809-1.124l1.016-.58.438-.274c.428-.28 1.072-.726 2.686-1.853 1.621-1.133 3.186-1.78 4.881-2.059 1.152-.19 1.974-.213 3.814-.138l.02-1.907z"></path></svg>
|
|
4
|
-
<svg v-else-if="matches(['anthropic','claude','haiku'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M16.765 5h-3.308l5.923 15h3.23zM7.226 5L1.38 20h3.308l1.307-3.154h6.154l1.23 3.077h3.309L10.688 5zm-.308 9.077l2-5.308l2.077 5.308z"/></svg>
|
|
5
|
-
<svg v-else-if="matches(['google','gemini'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linejoin="round" stroke-width="1.5" d="M3 12a9 9 0 0 0 9-9a9 9 0 0 0 9 9a9 9 0 0 0-9 9a9 9 0 0 0-9-9Z"/></svg>
|
|
6
|
-
<svg v-else-if="matches(['grok','xai'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" fill-rule="evenodd"><path d="M6.469 8.776L16.512 23h-4.464L2.005 8.776H6.47zm-.004 7.9l2.233 3.164L6.467 23H2l4.465-6.324zM22 2.582V23h-3.659V7.764L22 2.582zM22 1l-9.952 14.095-2.233-3.163L17.533 1H22z"></path></svg>
|
|
7
|
-
<svg v-else-if="matches(['zai','glm'])" class="size-5" xmlns="http://www.w3.org/2000/svg" fill="currentColor" fill-rule="evenodd" viewBox="0 0 24 24"><title>Z.ai</title><path d="M12.105 2L9.927 4.953H.653L2.83 2h9.276zM23.254 19.048L21.078 22h-9.242l2.174-2.952h9.244zM24 2L9.264 22H0L14.736 2H24z"></path></svg>
|
|
8
|
-
<svg v-else-if="matches(['qwen'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"><path d="M9 2h3.5L14 4.5h5.13L20.5 7m1.5 7.5l-1.645 2.663h-2.477L15 22h-3.217M5 20l-1.5-2.5l1-3l-2.5-5L4 7"/><path d="m19.19 9.662l1.31-2.661H10l1-2l-2-3l-2.251 5H4l5 10H6l-1 3h5.5l1.252 2l5.65-9.935L18.94 14.5H22z"/><path d="M12 15.5L9 10h6z"/></g></svg>
|
|
9
|
-
<svg v-else-if="matches(['mistral','codestral'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 233"><path d="M186.182 0h46.545v46.545h-46.545z"/><path fill="#f7d046" d="M209.455 0H256v46.545h-46.545z"/><path d="M0 0h46.545v46.545H0zm0 46.545h46.545V93.09H0zm0 46.546h46.545v46.545H0zm0 46.545h46.545v46.545H0zm0 46.546h46.545v46.545H0z"/><path fill="#f7d046" d="M23.273 0h46.545v46.545H23.273z"/><path fill="#f2a73b" d="M209.455 46.545H256V93.09h-46.545zm-186.182 0h46.545V93.09H23.273z"/><path d="M139.636 46.545h46.545V93.09h-46.545z"/><path fill="#f2a73b" d="M162.909 46.545h46.545V93.09h-46.545zm-93.091 0h46.545V93.09H69.818z"/><path fill="#ee792f" d="M116.364 93.091h46.545v46.545h-46.545zm46.545 0h46.545v46.545h-46.545zm-93.091 0h46.545v46.545H69.818z"/><path d="M93.091 139.636h46.545v46.545H93.091z"/><path fill="#eb5829" d="M116.364 139.636h46.545v46.545h-46.545z"/><path fill="#ee792f" d="M209.455 93.091H256v46.545h-46.545zm-186.182 0h46.545v46.545H23.273z"/><path d="M186.182 139.636h46.545v46.545h-46.545z"/><path fill="#eb5829" d="M209.455 139.636H256v46.545h-46.545z"/><path d="M186.182 186.182h46.545v46.545h-46.545z"/><path fill="#eb5829" d="M23.273 139.636h46.545v46.545H23.273z"/><path fill="#ea3326" d="M209.455 186.182H256v46.545h-46.545zm-186.182 0h46.545v46.545H23.273z"/></svg>
|
|
10
|
-
<svg v-else-if="matches(['groq'])" class="size-5" xmlns="http://www.w3.org/2000/svg" fill="currentColor" fill-rule="evenodd" viewBox="0 0 24 24"><path d="M12.036 2c-3.853-.035-7 3-7.036 6.781-.035 3.782 3.055 6.872 6.908 6.907h2.42v-2.566h-2.292c-2.407.028-4.38-1.866-4.408-4.23-.029-2.362 1.901-4.298 4.308-4.326h.1c2.407 0 4.358 1.915 4.365 4.278v6.305c0 2.342-1.944 4.25-4.323 4.279a4.375 4.375 0 01-3.033-1.252l-1.851 1.818A7 7 0 0012.029 22h.092c3.803-.056 6.858-3.083 6.879-6.816v-6.5C18.907 4.963 15.817 2 12.036 2z"></path></svg>
|
|
11
|
-
<svg v-else-if="matches(['llama'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" fill-rule="evenodd">
|
|
12
|
-
<path d="M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z"></path>
|
|
13
|
-
</svg>
|
|
14
|
-
<svg v-else-if="matches(['servicestack'])" class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path fill="currentColor" d="M96 216c81.7 10.2 273.7 102.3 304 232H8c99.5-8.1 184.5-137 88-232m32-152c32.3 35.6 47.7 83.9 46.4 133.6C257.3 231.3 381.7 321.3 408 448h96C463.3 231.9 230.8 79.5 128 64"/></svg>
|
|
15
|
-
<svg v-else class="size-5" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linejoin="round" d="M12.019 16.225L8.35 14.13m3.669 2.096l3.65-2.129m-3.65 2.13L9.183 17.88l-5.196-3a5 5 0 0 1-.714-.498m5.077-.252L5.5 12.5v-6q0-.444.075-.867m2.775 8.496l-.018-4.225m5.97-6.652a5.001 5.001 0 0 0-8.727 2.38m8.727-2.38a5 5 0 0 0-.789.369l-5.196 3l.015 3.283m5.97-6.652a5.001 5.001 0 0 1 6.425 6.367M5.575 5.633a5.001 5.001 0 0 0-2.302 8.748m8.708-6.606l3.669 2.096m-3.67-2.096L8.33 9.904m3.65-2.129l2.836-1.654l5.196 3q.384.223.714.498m-5.077.252L18.5 11.5v6q0 .444-.075.867M15.65 9.871l.018 4.225m-5.97 6.652a5.001 5.001 0 0 0 8.727-2.38m-8.727 2.38a5 5 0 0 0 .789-.369l5.196-3l-.015-3.283m-5.97 6.652a5.001 5.001 0 0 1-6.425-6.367m15.152 3.986a5.001 5.001 0 0 0 2.302-8.748" stroke-width="1"/></svg>
|
|
16
|
-
`,
|
|
17
|
-
props: {
|
|
18
|
-
provider: String,
|
|
19
|
-
},
|
|
20
|
-
setup(props) {
|
|
21
|
-
function matches(providers) {
|
|
22
|
-
if (!props.provider) return false
|
|
23
|
-
const providerLower = props.provider.toLowerCase().replace(/[\s-.]+/g, '')
|
|
24
|
-
return providers.some(provider => providerLower.includes(provider))
|
|
25
|
-
}
|
|
26
|
-
return {
|
|
27
|
-
matches
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
}
|
llms/ui/ProviderStatus.mjs
DELETED
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
import { ref, computed, inject, onMounted, onUnmounted } from "vue"
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
template:`
|
|
5
|
-
<div v-if="$ai.isAdmin" ref="triggerRef" class="relative" :key="renderKey">
|
|
6
|
-
<button type="button" @click="togglePopover"
|
|
7
|
-
class="mt-1 flex space-x-2 items-center text-sm font-semibold select-none rounded-sm py-2 px-3 border border-transparent hover:bg-gray-50 dark:hover:bg-gray-700 hover:shadow hover:border-gray-200 dark:hover:border-gray-600">
|
|
8
|
-
<span class="text-gray-600 dark:text-gray-400" :title="models.length + ' models from ' + (config.status.enabled||[]).length + ' enabled providers'">{{models.length}}</span>
|
|
9
|
-
<div class="cursor-pointer flex items-center" :title="'Enabled:\\n' + (config.status.enabled||[]).map(x => ' ' + x).join('\\n')">
|
|
10
|
-
<svg class="size-4 text-green-400 dark:text-green-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="12" r="9" fill="currentColor"/></svg>
|
|
11
|
-
<span class="text-green-700 dark:text-green-400">{{(config.status.enabled||[]).length}}</span>
|
|
12
|
-
</div>
|
|
13
|
-
<div class="cursor-pointer flex items-center" :title="'Disabled:\\n' + (config.status.disabled||[]).map(x => ' ' + x).join('\\n')">
|
|
14
|
-
<svg class="size-4 text-red-400 dark:text-red-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><circle cx="12" cy="12" r="9" fill="currentColor"/></svg>
|
|
15
|
-
<span class="text-red-700 dark:text-red-400">{{(config.status.disabled||[]).length}}</span>
|
|
16
|
-
</div>
|
|
17
|
-
</button>
|
|
18
|
-
<div v-if="showPopover" ref="popoverRef" class="absolute right-0 mt-2 w-72 max-h-120 overflow-y-auto bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-md shadow-lg z-10">
|
|
19
|
-
<div class="divide-y divide-gray-100 dark:divide-gray-700">
|
|
20
|
-
<div v-for="p in allProviders" :key="p" class="flex items-center justify-between px-3 py-2">
|
|
21
|
-
<label :for="'chk_' + p" class="cursor-pointer text-sm text-gray-900 dark:text-gray-100 truncate mr-2" :title="p">{{ p }}</label>
|
|
22
|
-
<div @click="onToggle(p, !isEnabled(p))" class="cursor-pointer group relative inline-flex h-5 w-10 shrink-0 items-center justify-center rounded-full outline-offset-2 outline-green-600 has-focus-visible:outline-2">
|
|
23
|
-
<span class="absolute mx-auto h-4 w-9 rounded-full bg-gray-200 dark:bg-gray-700 inset-ring inset-ring-gray-900/5 dark:inset-ring-gray-100/5 transition-colors duration-200 ease-in-out group-has-checked:bg-green-600 dark:group-has-checked:bg-green-500" />
|
|
24
|
-
<span class="absolute left-0 size-5 rounded-full border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-200 shadow-xs transition-transform duration-200 ease-in-out group-has-checked:translate-x-5" />
|
|
25
|
-
<input :id="'chk_' + p" type="checkbox" :checked="isEnabled(p)" class="switch cursor-pointer absolute inset-0 appearance-none focus:outline-hidden" aria-label="Use setting" name="setting" />
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
28
|
-
</div>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
`,
|
|
32
|
-
emits: ['updated'],
|
|
33
|
-
setup(props, { emit }) {
|
|
34
|
-
const ai = inject('ai')
|
|
35
|
-
const config = inject('config')
|
|
36
|
-
const models = inject('models')
|
|
37
|
-
const showPopover = ref(false)
|
|
38
|
-
const triggerRef = ref(null)
|
|
39
|
-
const popoverRef = ref(null)
|
|
40
|
-
const pending = ref({})
|
|
41
|
-
const renderKey = ref(0)
|
|
42
|
-
const allProviders = computed(() => config.status?.all)
|
|
43
|
-
const isEnabled = (p) => config.status.enabled.includes(p)
|
|
44
|
-
const togglePopover = () => showPopover.value = !showPopover.value
|
|
45
|
-
|
|
46
|
-
const onToggle = async (provider, enable) => {
|
|
47
|
-
pending.value = { ...pending.value, [provider]: true }
|
|
48
|
-
try {
|
|
49
|
-
const res = await ai.post(`/providers/${encodeURIComponent(provider)}`, {
|
|
50
|
-
body: JSON.stringify(enable ? { enable: true } : { disable: true })
|
|
51
|
-
})
|
|
52
|
-
if (!res.ok) throw new Error(`HTTP ${res.status} ${res.statusText}`)
|
|
53
|
-
const json = await res.json()
|
|
54
|
-
config.status.enabled = json.enabled || []
|
|
55
|
-
config.status.disabled = json.disabled || []
|
|
56
|
-
if (json.feedback) {
|
|
57
|
-
alert(json.feedback)
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
const [configRes, modelsRes] = await Promise.all([
|
|
62
|
-
ai.getConfig(),
|
|
63
|
-
ai.getModels(),
|
|
64
|
-
])
|
|
65
|
-
const newConfig = await configRes.json()
|
|
66
|
-
const newModels = await modelsRes.json()
|
|
67
|
-
Object.assign(config, newConfig)
|
|
68
|
-
models.length = 0
|
|
69
|
-
newModels.forEach(m => models.push(m))
|
|
70
|
-
emit('updated')
|
|
71
|
-
renderKey.value++
|
|
72
|
-
} catch (e) {
|
|
73
|
-
alert(`Failed to reload config: ${e.message}`)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
} catch (e) {
|
|
77
|
-
alert(`Failed to ${enable ? 'enable' : 'disable'} ${provider}: ${e.message}`)
|
|
78
|
-
} finally {
|
|
79
|
-
pending.value = { ...pending.value, [provider]: false }
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const onDocClick = (e) => {
|
|
84
|
-
const t = e.target
|
|
85
|
-
if (triggerRef.value?.contains(t)) return
|
|
86
|
-
if (popoverRef.value?.contains(t)) return
|
|
87
|
-
showPopover.value = false
|
|
88
|
-
}
|
|
89
|
-
onMounted(() => document.addEventListener('click', onDocClick))
|
|
90
|
-
onUnmounted(() => document.removeEventListener('click', onDocClick))
|
|
91
|
-
return {
|
|
92
|
-
renderKey,
|
|
93
|
-
config,
|
|
94
|
-
models,
|
|
95
|
-
showPopover,
|
|
96
|
-
triggerRef,
|
|
97
|
-
popoverRef,
|
|
98
|
-
allProviders,
|
|
99
|
-
isEnabled,
|
|
100
|
-
togglePopover,
|
|
101
|
-
onToggle,
|
|
102
|
-
pending,
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
}
|
llms/ui/SignIn.mjs
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { inject, ref } from "vue"
|
|
2
|
-
import { toJsonObject } from "./utils.mjs"
|
|
3
|
-
|
|
4
|
-
export default {
|
|
5
|
-
template: `
|
|
6
|
-
<div class="min-h-full -mt-12 flex flex-col justify-center py-12 sm:px-6 lg:px-8">
|
|
7
|
-
<div class="sm:mx-auto sm:w-full sm:max-w-md">
|
|
8
|
-
<h2 class="mt-6 text-center text-3xl font-extrabold text-gray-900 dark:text-gray-50">
|
|
9
|
-
Sign In
|
|
10
|
-
</h2>
|
|
11
|
-
</div>
|
|
12
|
-
<div class="mt-8 sm:mx-auto sm:w-full sm:max-w-md">
|
|
13
|
-
<ErrorSummary v-if="errorSummary" class="mb-3" :status="errorSummary" />
|
|
14
|
-
<div class="bg-white dark:bg-black py-8 px-4 shadow sm:rounded-lg sm:px-10">
|
|
15
|
-
<form @submit.prevent="submit">
|
|
16
|
-
<div class="flex flex-1 flex-col justify-between">
|
|
17
|
-
<div class="space-y-6">
|
|
18
|
-
<fieldset class="grid grid-cols-12 gap-6">
|
|
19
|
-
<div class="w-full col-span-12">
|
|
20
|
-
<TextInput id="apiKey" name="apiKey" label="API Key" v-model="apiKey" />
|
|
21
|
-
</div>
|
|
22
|
-
</fieldset>
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
<div class="mt-8">
|
|
26
|
-
<PrimaryButton class="w-full">Sign In</PrimaryButton>
|
|
27
|
-
</div>
|
|
28
|
-
</form>
|
|
29
|
-
</div>
|
|
30
|
-
</div>
|
|
31
|
-
</div>
|
|
32
|
-
`,
|
|
33
|
-
emits: ['done'],
|
|
34
|
-
setup(props, { emit }) {
|
|
35
|
-
const ai = inject('ai')
|
|
36
|
-
const apiKey = ref('')
|
|
37
|
-
const errorSummary = ref()
|
|
38
|
-
async function submit() {
|
|
39
|
-
const r = await ai.get('/auth', {
|
|
40
|
-
headers: {
|
|
41
|
-
'Authorization': `Bearer ${apiKey.value}`
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
const txt = await r.text()
|
|
45
|
-
const json = toJsonObject(txt)
|
|
46
|
-
// console.log('json', json)
|
|
47
|
-
if (r.ok) {
|
|
48
|
-
json.apiKey = apiKey.value
|
|
49
|
-
emit('done', json)
|
|
50
|
-
} else {
|
|
51
|
-
errorSummary.value = json.responseStatus || {
|
|
52
|
-
errorCode: "Unauthorized",
|
|
53
|
-
message: 'Invalid API Key'
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
return {
|
|
59
|
-
apiKey,
|
|
60
|
-
submit,
|
|
61
|
-
errorSummary,
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
llms/ui/SystemPromptEditor.mjs
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
template:`
|
|
3
|
-
<div class="border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800 px-6 py-4">
|
|
4
|
-
<div class="max-w-6xl mx-auto">
|
|
5
|
-
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
|
|
6
|
-
System Prompt
|
|
7
|
-
<span v-if="selected" class="text-gray-500 dark:text-gray-400 font-normal">
|
|
8
|
-
({{ prompts.find(p => p.id === selected.id)?.name || 'Custom' }})
|
|
9
|
-
</span>
|
|
10
|
-
</label>
|
|
11
|
-
<textarea
|
|
12
|
-
:value="modelValue" @input="$emit('update:modelValue', $event.target.value)"
|
|
13
|
-
placeholder="Enter a system prompt to guide AI's behavior..."
|
|
14
|
-
rows="6"
|
|
15
|
-
class="block w-full resize-vertical rounded-md border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-900 text-gray-900 dark:text-gray-100 px-3 py-2 text-sm placeholder-gray-500 dark:placeholder-gray-400 focus:border-blue-500 focus:outline-none focus:ring-1 focus:ring-blue-500"
|
|
16
|
-
></textarea>
|
|
17
|
-
<div class="mt-2 text-xs text-gray-500 dark:text-gray-400">
|
|
18
|
-
You can modify this system prompt before sending messages. Changes will only apply to new conversations.
|
|
19
|
-
</div>
|
|
20
|
-
</div>
|
|
21
|
-
</div>
|
|
22
|
-
`,
|
|
23
|
-
emits: ['update:modelValue'],
|
|
24
|
-
props: {
|
|
25
|
-
prompts: Array,
|
|
26
|
-
selected: Object,
|
|
27
|
-
modelValue: String,
|
|
28
|
-
},
|
|
29
|
-
setup() {
|
|
30
|
-
}
|
|
31
|
-
}
|
llms/ui/SystemPromptSelector.mjs
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { ref, onMounted, onUnmounted } from "vue"
|
|
2
|
-
export default {
|
|
3
|
-
template:`
|
|
4
|
-
<button v-if="modelValue" type="button" title="Clear System Prompt" @click="$emit('update:modelValue', null)">
|
|
5
|
-
<svg class="size-4 text-gray-500 dark:text-gray-400" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 6.41L17.59 5L12 10.59L6.41 5L5 6.41L10.59 12L5 17.59L6.41 19L12 13.41L17.59 19L19 17.59L13.41 12z"/></svg>
|
|
6
|
-
</button>
|
|
7
|
-
|
|
8
|
-
<Autocomplete ref="refSelector" id="prompt" :options="prompts" label=""
|
|
9
|
-
:modelValue="modelValue" @update:modelValue="$emit('update:modelValue', $event)"
|
|
10
|
-
class="w-68 xl:w-84"
|
|
11
|
-
:match="(x, value) => x.name.toLowerCase().includes(value.toLowerCase())"
|
|
12
|
-
placeholder="Select a System Prompt...">
|
|
13
|
-
<template #item="{ value }">
|
|
14
|
-
<div class="truncate max-w-72" :title="value">{{value}}</div>
|
|
15
|
-
</template>
|
|
16
|
-
</Autocomplete>
|
|
17
|
-
|
|
18
|
-
<!-- Toggle System Prompt Visibility -->
|
|
19
|
-
<button type="button"
|
|
20
|
-
@click="$emit('toggle')"
|
|
21
|
-
:class="show ? 'text-blue-700 dark:text-blue-400' : 'text-gray-600 dark:text-gray-400'"
|
|
22
|
-
class="p-1 rounded-md hover:bg-blue-100 dark:hover:bg-blue-900/30 hover:text-blue-700 dark:hover:text-blue-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2"
|
|
23
|
-
:title="show ? 'Hide system prompt' : 'Show system prompt'"
|
|
24
|
-
>
|
|
25
|
-
<svg v-if="!show" class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="currentColor" d="M33.62 17.53c-3.37-6.23-9.28-10-15.82-10S5.34 11.3 2 17.53l-.28.47l.26.48c3.37 6.23 9.28 10 15.82 10s12.46-3.72 15.82-10l.26-.48Zm-15.82 8.9C12.17 26.43 7 23.29 4 18c3-5.29 8.17-8.43 13.8-8.43S28.54 12.72 31.59 18c-3.05 5.29-8.17 8.43-13.79 8.43"/><path fill="currentColor" d="M18.09 11.17A6.86 6.86 0 1 0 25 18a6.86 6.86 0 0 0-6.91-6.83m0 11.72A4.86 4.86 0 1 1 23 18a4.87 4.87 0 0 1-4.91 4.89"/><path fill="none" d="M0 0h36v36H0z"/></svg>
|
|
26
|
-
<svg v-else class="size-6" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="currentColor" d="M25.19 20.4a6.8 6.8 0 0 0 .43-2.4a6.86 6.86 0 0 0-6.86-6.86a6.8 6.8 0 0 0-2.37.43L18 13.23a5 5 0 0 1 .74-.06A4.87 4.87 0 0 1 23.62 18a5 5 0 0 1-.06.74Z" class="clr-i-outline clr-i-outline-path-1"/><path fill="currentColor" d="M34.29 17.53c-3.37-6.23-9.28-10-15.82-10a16.8 16.8 0 0 0-5.24.85L14.84 10a14.8 14.8 0 0 1 3.63-.47c5.63 0 10.75 3.14 13.8 8.43a17.8 17.8 0 0 1-4.37 5.1l1.42 1.42a19.9 19.9 0 0 0 5-6l.26-.48Z"/><path fill="currentColor" d="m4.87 5.78l4.46 4.46a19.5 19.5 0 0 0-6.69 7.29l-.26.47l.26.48c3.37 6.23 9.28 10 15.82 10a16.9 16.9 0 0 0 7.37-1.69l5 5l1.75-1.5l-26-26Zm9.75 9.75l6.65 6.65a4.8 4.8 0 0 1-2.5.72A4.87 4.87 0 0 1 13.9 18a4.8 4.8 0 0 1 .72-2.47m-1.45-1.45a6.85 6.85 0 0 0 9.55 9.55l1.6 1.6a14.9 14.9 0 0 1-5.86 1.2c-5.63 0-10.75-3.14-13.8-8.43a17.3 17.3 0 0 1 6.12-6.3Z"/><path fill="none" d="M0 0h36v36H0z"/></svg>
|
|
27
|
-
</button>
|
|
28
|
-
`,
|
|
29
|
-
emits: ['updated', 'update:modelValue', 'toggle'],
|
|
30
|
-
props: {
|
|
31
|
-
prompts: Array,
|
|
32
|
-
modelValue: Object,
|
|
33
|
-
show: Boolean,
|
|
34
|
-
},
|
|
35
|
-
setup() {
|
|
36
|
-
const refSelector = ref()
|
|
37
|
-
|
|
38
|
-
function collapse(e) {
|
|
39
|
-
// call toggle when clicking outside of the Autocomplete component
|
|
40
|
-
if (refSelector.value && !refSelector.value.$el.contains(e.target)) {
|
|
41
|
-
refSelector.value.toggle(false)
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
onMounted(() => {
|
|
46
|
-
document.addEventListener('click', collapse)
|
|
47
|
-
})
|
|
48
|
-
onUnmounted(() => {
|
|
49
|
-
document.removeEventListener('click', collapse)
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
return {
|
|
53
|
-
refSelector,
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
llms/ui/Welcome.mjs
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export default {
|
|
2
|
-
template: `
|
|
3
|
-
<div class="mb-2 flex justify-center">
|
|
4
|
-
<svg class="size-20 text-gray-700 dark:text-gray-300" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill="currentColor" d="M8 2.19c3.13 0 5.68 2.25 5.68 5s-2.55 5-5.68 5a5.7 5.7 0 0 1-1.89-.29l-.75-.26l-.56.56a14 14 0 0 1-2 1.55a.13.13 0 0 1-.07 0v-.06a6.58 6.58 0 0 0 .15-4.29a5.25 5.25 0 0 1-.55-2.16c0-2.77 2.55-5 5.68-5M8 .94c-3.83 0-6.93 2.81-6.93 6.27a6.4 6.4 0 0 0 .64 2.64a5.53 5.53 0 0 1-.18 3.48a1.32 1.32 0 0 0 2 1.5a15 15 0 0 0 2.16-1.71a6.8 6.8 0 0 0 2.31.36c3.83 0 6.93-2.81 6.93-6.27S11.83.94 8 .94"/><ellipse cx="5.2" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/><ellipse cx="10.8" cy="7.7" fill="currentColor" rx=".8" ry=".75"/></svg>
|
|
5
|
-
</div>
|
|
6
|
-
<h2 class="text-2xl font-semibold text-gray-900 dark:text-gray-100 mb-2">{{ $ai.welcome }}</h2>
|
|
7
|
-
`
|
|
8
|
-
}
|