llms-py 2.0.9__py3-none-any.whl → 3.0.10__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/__init__.py +4 -0
- llms/__main__.py +9 -0
- llms/db.py +359 -0
- llms/extensions/analytics/ui/index.mjs +1444 -0
- llms/extensions/app/README.md +20 -0
- llms/extensions/app/__init__.py +589 -0
- llms/extensions/app/db.py +536 -0
- {llms_py-2.0.9.data/data → llms/extensions/app}/ui/Recents.mjs +100 -73
- llms_py-2.0.9.data/data/ui/Sidebar.mjs → llms/extensions/app/ui/index.mjs +150 -79
- llms/extensions/app/ui/threadStore.mjs +433 -0
- llms/extensions/core_tools/CALCULATOR.md +32 -0
- llms/extensions/core_tools/__init__.py +637 -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/codemirror.css +344 -0
- llms/extensions/core_tools/ui/codemirror/codemirror.js +9884 -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/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 +63 -0
- llms/extensions/gallery/db.py +243 -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/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 +22 -0
- llms/extensions/providers/anthropic.py +233 -0
- llms/extensions/providers/cerebras.py +37 -0
- llms/extensions/providers/chutes.py +153 -0
- llms/extensions/providers/google.py +481 -0
- llms/extensions/providers/nvidia.py +103 -0
- llms/extensions/providers/openai.py +154 -0
- llms/extensions/providers/openrouter.py +74 -0
- llms/extensions/providers/zai.py +182 -0
- llms/extensions/system_prompts/README.md +22 -0
- llms/extensions/system_prompts/__init__.py +45 -0
- llms/extensions/system_prompts/ui/index.mjs +280 -0
- llms/extensions/system_prompts/ui/prompts.json +1067 -0
- llms/extensions/tools/__init__.py +144 -0
- llms/extensions/tools/ui/index.mjs +706 -0
- llms/index.html +58 -0
- llms/llms.json +400 -0
- llms/main.py +4407 -0
- llms/providers-extra.json +394 -0
- llms/providers.json +1 -0
- llms/ui/App.mjs +188 -0
- llms/ui/ai.mjs +217 -0
- llms/ui/app.css +7081 -0
- llms/ui/ctx.mjs +412 -0
- llms/ui/index.mjs +131 -0
- llms/ui/lib/chart.js +14 -0
- llms/ui/lib/charts.mjs +16 -0
- llms/ui/lib/color.js +14 -0
- llms/ui/lib/servicestack-vue.mjs +37 -0
- llms/ui/lib/vue.min.mjs +13 -0
- llms/ui/lib/vue.mjs +18530 -0
- {llms_py-2.0.9.data/data → llms}/ui/markdown.mjs +33 -15
- llms/ui/modules/chat/ChatBody.mjs +976 -0
- llms/ui/modules/chat/SettingsDialog.mjs +374 -0
- llms/ui/modules/chat/index.mjs +991 -0
- llms/ui/modules/icons.mjs +46 -0
- llms/ui/modules/layout.mjs +271 -0
- llms/ui/modules/model-selector.mjs +811 -0
- llms/ui/tailwind.input.css +742 -0
- {llms_py-2.0.9.data/data → llms}/ui/typography.css +133 -7
- llms/ui/utils.mjs +261 -0
- llms_py-3.0.10.dist-info/METADATA +49 -0
- llms_py-3.0.10.dist-info/RECORD +177 -0
- llms_py-3.0.10.dist-info/entry_points.txt +2 -0
- {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/licenses/LICENSE +1 -2
- llms.py +0 -1402
- llms_py-2.0.9.data/data/index.html +0 -64
- llms_py-2.0.9.data/data/llms.json +0 -447
- llms_py-2.0.9.data/data/requirements.txt +0 -1
- llms_py-2.0.9.data/data/ui/App.mjs +0 -20
- llms_py-2.0.9.data/data/ui/ChatPrompt.mjs +0 -389
- llms_py-2.0.9.data/data/ui/Main.mjs +0 -680
- llms_py-2.0.9.data/data/ui/app.css +0 -3951
- llms_py-2.0.9.data/data/ui/lib/servicestack-vue.min.mjs +0 -37
- llms_py-2.0.9.data/data/ui/lib/vue.min.mjs +0 -12
- llms_py-2.0.9.data/data/ui/tailwind.input.css +0 -261
- llms_py-2.0.9.data/data/ui/threadStore.mjs +0 -273
- llms_py-2.0.9.data/data/ui/utils.mjs +0 -114
- llms_py-2.0.9.data/data/ui.json +0 -1069
- llms_py-2.0.9.dist-info/METADATA +0 -941
- llms_py-2.0.9.dist-info/RECORD +0 -30
- llms_py-2.0.9.dist-info/entry_points.txt +0 -2
- {llms_py-2.0.9.data/data → llms}/ui/fav.svg +0 -0
- {llms_py-2.0.9.data/data → llms}/ui/lib/highlight.min.mjs +0 -0
- {llms_py-2.0.9.data/data → llms}/ui/lib/idb.min.mjs +0 -0
- {llms_py-2.0.9.data/data → llms}/ui/lib/marked.min.mjs +0 -0
- /llms_py-2.0.9.data/data/ui/lib/servicestack-client.min.mjs → /llms/ui/lib/servicestack-client.mjs +0 -0
- {llms_py-2.0.9.data/data → llms}/ui/lib/vue-router.min.mjs +0 -0
- {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/WHEEL +0 -0
- {llms_py-2.0.9.dist-info → llms_py-3.0.10.dist-info}/top_level.txt +0 -0
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<html>
|
|
2
|
-
<head>
|
|
3
|
-
<title>llms.py</title>
|
|
4
|
-
<link rel="stylesheet" href="/ui/typography.css">
|
|
5
|
-
<link rel="stylesheet" href="/ui/app.css">
|
|
6
|
-
<link rel="icon" type="image/svg" href="/ui/fav.svg">
|
|
7
|
-
</head>
|
|
8
|
-
<script type="importmap">
|
|
9
|
-
{
|
|
10
|
-
"imports": {
|
|
11
|
-
"vue": "/ui/lib/vue.min.mjs",
|
|
12
|
-
"vue-router": "/ui/lib/vue-router.min.mjs",
|
|
13
|
-
"@servicestack/client": "/ui/lib/servicestack-client.min.mjs",
|
|
14
|
-
"@servicestack/vue": "/ui/lib/servicestack-vue.min.mjs",
|
|
15
|
-
"highlight.mjs": "/ui/lib/highlight.min.mjs"
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
</script>
|
|
19
|
-
<body>
|
|
20
|
-
<div id="app"></div>
|
|
21
|
-
</body>
|
|
22
|
-
<script type="module">
|
|
23
|
-
import { createApp, defineAsyncComponent } from 'vue'
|
|
24
|
-
import { createWebHistory, createRouter } from "vue-router"
|
|
25
|
-
import ServiceStackVue from "@servicestack/vue"
|
|
26
|
-
import { useThreadStore } from '/ui/threadStore.mjs'
|
|
27
|
-
import App from '/ui/App.mjs'
|
|
28
|
-
|
|
29
|
-
async function init() {
|
|
30
|
-
// Load models and prompts
|
|
31
|
-
const { initDB } = useThreadStore()
|
|
32
|
-
const [_, configRes, modelsRes] = await Promise.all([
|
|
33
|
-
await initDB(),
|
|
34
|
-
fetch('/ui.json'),
|
|
35
|
-
fetch('/models'),
|
|
36
|
-
])
|
|
37
|
-
const config = await configRes.json()
|
|
38
|
-
const models = await modelsRes.json()
|
|
39
|
-
return { config, models }
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const { config, models } = await init()
|
|
43
|
-
const MainComponent = defineAsyncComponent(() => import('/ui/Main.mjs'))
|
|
44
|
-
const RecentsComponent = defineAsyncComponent(() => import('/ui/Recents.mjs'))
|
|
45
|
-
|
|
46
|
-
const routes = [
|
|
47
|
-
{ path: '/', component: MainComponent },
|
|
48
|
-
{ path: '/c/:id', component: MainComponent },
|
|
49
|
-
{ path: '/recents', component: RecentsComponent },
|
|
50
|
-
{ path: '/:fallback(.*)*', component: MainComponent }
|
|
51
|
-
]
|
|
52
|
-
const router = createRouter({
|
|
53
|
-
history: createWebHistory(),
|
|
54
|
-
routes,
|
|
55
|
-
})
|
|
56
|
-
const app = createApp(App, { config, models })
|
|
57
|
-
app.use(router)
|
|
58
|
-
app.use(ServiceStackVue)
|
|
59
|
-
app.provide('config', config)
|
|
60
|
-
app.provide('models', models)
|
|
61
|
-
|
|
62
|
-
app.mount('#app')
|
|
63
|
-
</script>
|
|
64
|
-
</html>
|
|
@@ -1,447 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"defaults": {
|
|
3
|
-
"headers": {
|
|
4
|
-
"Content-Type": "application/json",
|
|
5
|
-
"User-Agent": "llms.py/1.0"
|
|
6
|
-
},
|
|
7
|
-
"text": {
|
|
8
|
-
"model": "kimi-k2",
|
|
9
|
-
"messages": [
|
|
10
|
-
{
|
|
11
|
-
"role": "user",
|
|
12
|
-
"content": [
|
|
13
|
-
{
|
|
14
|
-
"type": "text",
|
|
15
|
-
"text": ""
|
|
16
|
-
}
|
|
17
|
-
]
|
|
18
|
-
}
|
|
19
|
-
]
|
|
20
|
-
},
|
|
21
|
-
"image": {
|
|
22
|
-
"model": "qwen2.5vl",
|
|
23
|
-
"messages": [
|
|
24
|
-
{
|
|
25
|
-
"role": "user",
|
|
26
|
-
"content": [
|
|
27
|
-
{
|
|
28
|
-
"type": "image_url",
|
|
29
|
-
"image_url": {
|
|
30
|
-
"url": ""
|
|
31
|
-
}
|
|
32
|
-
},
|
|
33
|
-
{
|
|
34
|
-
"type": "text",
|
|
35
|
-
"text": "Describe the key features of the input image"
|
|
36
|
-
}
|
|
37
|
-
]
|
|
38
|
-
}
|
|
39
|
-
]
|
|
40
|
-
},
|
|
41
|
-
"audio": {
|
|
42
|
-
"model": "gpt-4o-audio-preview",
|
|
43
|
-
"messages": [
|
|
44
|
-
{
|
|
45
|
-
"role": "user",
|
|
46
|
-
"content": [
|
|
47
|
-
{
|
|
48
|
-
"type": "input_audio",
|
|
49
|
-
"input_audio": {
|
|
50
|
-
"data": "",
|
|
51
|
-
"format": "mp3"
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"type": "text",
|
|
56
|
-
"text": "Please transcribe and summarize this audio file"
|
|
57
|
-
}
|
|
58
|
-
]
|
|
59
|
-
}
|
|
60
|
-
]
|
|
61
|
-
},
|
|
62
|
-
"file": {
|
|
63
|
-
"model": "qwen2.5vl",
|
|
64
|
-
"messages": [
|
|
65
|
-
{
|
|
66
|
-
"role": "user",
|
|
67
|
-
"content": [
|
|
68
|
-
{
|
|
69
|
-
"type": "file",
|
|
70
|
-
"file": {
|
|
71
|
-
"filename": "",
|
|
72
|
-
"file_data": ""
|
|
73
|
-
}
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"type": "text",
|
|
77
|
-
"text": "Please summarize this document"
|
|
78
|
-
}
|
|
79
|
-
]
|
|
80
|
-
}
|
|
81
|
-
]
|
|
82
|
-
}
|
|
83
|
-
},
|
|
84
|
-
"providers": {
|
|
85
|
-
"openrouter_free": {
|
|
86
|
-
"enabled": true,
|
|
87
|
-
"type": "OpenAiProvider",
|
|
88
|
-
"base_url": "https://openrouter.ai/api",
|
|
89
|
-
"api_key": "$OPENROUTER_FREE_API_KEY",
|
|
90
|
-
"models": {
|
|
91
|
-
"qwen2.5vl": "qwen/qwen2.5-vl-32b-instruct:free",
|
|
92
|
-
"llama4:109b": "meta-llama/llama-4-scout:free",
|
|
93
|
-
"llama4:400b": "meta-llama/llama-4-maverick:free",
|
|
94
|
-
"deepseek-v3.1:671b": "deepseek/deepseek-chat-v3.1:free",
|
|
95
|
-
"deepseek-r1:671b": "deepseek/deepseek-r1-0528:free",
|
|
96
|
-
"gemini-2.0-flash": "google/gemini-2.0-flash-exp:free",
|
|
97
|
-
"glm-4.5-air": "z-ai/glm-4.5-air:free",
|
|
98
|
-
"grok-4-fast": "x-ai/grok-4-fast:free",
|
|
99
|
-
"mai-ds-r1": "microsoft/mai-ds-r1:free",
|
|
100
|
-
"llama3.3:70b": "meta-llama/llama-3.3-70b-instruct:free",
|
|
101
|
-
"kimi-k2": "moonshotai/kimi-k2:free",
|
|
102
|
-
"nemotron-nano:9b": "nvidia/nemotron-nano-9b-v2:free",
|
|
103
|
-
"deepseek-r1-distill-llama:70b": "deepseek/deepseek-r1-distill-llama-70b:free",
|
|
104
|
-
"gpt-oss:20b": "openai/gpt-oss-20b:free",
|
|
105
|
-
"mistral-small3.2:24b": "mistralai/mistral-small-3.2-24b-instruct:free",
|
|
106
|
-
"mistral-nemo:12b": "mistralai/mistral-nemo:free",
|
|
107
|
-
"devstral-small": "mistralai/devstral-small-2505:free",
|
|
108
|
-
"venice-uncensored:24b": "cognitivecomputations/dolphin-mistral-24b-venice-edition:free",
|
|
109
|
-
"llama3.3:8b": "meta-llama/llama-3.3-8b-instruct:free",
|
|
110
|
-
"llama3.1:405b": "meta-llama/llama-3.1-405b-instruct:free",
|
|
111
|
-
"kimi-dev:72b": "moonshotai/kimi-dev-72b:free",
|
|
112
|
-
"gemma3:27b": "google/gemma-3-27b-it:free",
|
|
113
|
-
"qwen3-coder": "qwen/qwen3-coder:free",
|
|
114
|
-
"qwen3:235b": "qwen/qwen3-235b-a22b:free",
|
|
115
|
-
"qwen3:30b": "qwen/qwen3-30b-a3b:free",
|
|
116
|
-
"qwen3:8b": "qwen/qwen3-8b:free",
|
|
117
|
-
"qwen3:4b": "qwen/qwen3-4b:free",
|
|
118
|
-
"qwen2.5vl:72b": "qwen/qwen2.5-vl-72b-instruct:free",
|
|
119
|
-
"qwen2.5vl:32b": "qwen/qwen2.5-vl-32b-instruct:free",
|
|
120
|
-
"qwen-2.5:72b": "qwen/qwen-2.5-72b-instruct:free",
|
|
121
|
-
"hunyuan-a13b": "tencent/hunyuan-a13b-instruct:free"
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
"groq": {
|
|
125
|
-
"enabled": true,
|
|
126
|
-
"type": "OpenAiProvider",
|
|
127
|
-
"base_url": "https://api.groq.com/openai",
|
|
128
|
-
"api_key": "$GROQ_API_KEY",
|
|
129
|
-
"models": {
|
|
130
|
-
"allam-2-7b": "allam-2-7b",
|
|
131
|
-
"gemma2:9b": "gemma2-9b-it",
|
|
132
|
-
"compound": "groq/compound",
|
|
133
|
-
"compound-mini": "groq/compound-mini",
|
|
134
|
-
"llama3.1:8b": "llama-3.1-8b-instant",
|
|
135
|
-
"llama3.3:70b": "llama-3.3-70b-versatile",
|
|
136
|
-
"llama4:109b": "meta-llama/llama-4-scout-17b-16e-instruct",
|
|
137
|
-
"llama4:400b": "meta-llama/llama-4-maverick-17b-128e-instruct",
|
|
138
|
-
"llama-guard-4:12b": "meta-llama/llama-guard-4-12b",
|
|
139
|
-
"llama-prompt-guard2:22m": "meta-llama/llama-prompt-guard-2-22m",
|
|
140
|
-
"llama-prompt-guard2:86m": "meta-llama/llama-prompt-guard-2-86m",
|
|
141
|
-
"kimi-k2": "moonshotai/kimi-k2-instruct-0905",
|
|
142
|
-
"gpt-oss:120b": "openai/gpt-oss-120b",
|
|
143
|
-
"gpt-oss:20b": "openai/gpt-oss-20b",
|
|
144
|
-
"qwen3:32b": "qwen/qwen3-32b"
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
"google_free": {
|
|
148
|
-
"enabled": true,
|
|
149
|
-
"type": "GoogleProvider",
|
|
150
|
-
"api_key": "$GOOGLE_FREE_API_KEY",
|
|
151
|
-
"models": {
|
|
152
|
-
"gemini-flash-latest": "gemini-flash-latest",
|
|
153
|
-
"gemini-flash-lite-latest": "gemini-flash-lite-latest",
|
|
154
|
-
"gemini-2.5-pro": "gemini-2.5-pro",
|
|
155
|
-
"gemini-2.5-flash": "gemini-2.5-flash",
|
|
156
|
-
"gemini-2.5-flash-lite": "gemini-2.5-flash-lite"
|
|
157
|
-
},
|
|
158
|
-
"safety_settings": [
|
|
159
|
-
{
|
|
160
|
-
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
|
|
161
|
-
"threshold": "BLOCK_ONLY_HIGH"
|
|
162
|
-
}
|
|
163
|
-
],
|
|
164
|
-
"thinking_config": {
|
|
165
|
-
"thinkingBudget": 1024,
|
|
166
|
-
"includeThoughts": true
|
|
167
|
-
}
|
|
168
|
-
},
|
|
169
|
-
"codestral": {
|
|
170
|
-
"enabled": true,
|
|
171
|
-
"type": "OpenAiProvider",
|
|
172
|
-
"base_url": "https://codestral.mistral.ai",
|
|
173
|
-
"api_key": "$CODESTRAL_API_KEY",
|
|
174
|
-
"models": {
|
|
175
|
-
"codestral:22b": "codestral-latest"
|
|
176
|
-
}
|
|
177
|
-
},
|
|
178
|
-
"ollama": {
|
|
179
|
-
"enabled": false,
|
|
180
|
-
"type": "OllamaProvider",
|
|
181
|
-
"base_url": "http://localhost:11434",
|
|
182
|
-
"models": {},
|
|
183
|
-
"all_models": true
|
|
184
|
-
},
|
|
185
|
-
"openrouter": {
|
|
186
|
-
"enabled": false,
|
|
187
|
-
"type": "OpenAiProvider",
|
|
188
|
-
"base_url": "https://openrouter.ai/api",
|
|
189
|
-
"api_key": "$OPENROUTER_API_KEY",
|
|
190
|
-
"models": {
|
|
191
|
-
"llama3.1:70b": "meta-llama/llama-3.1-405b-instruct",
|
|
192
|
-
"llama3.3:70b": "meta-llama/llama-3.3-70b-instruct",
|
|
193
|
-
"phi-4:14b": "microsoft/phi-4",
|
|
194
|
-
"codestral:22b": "mistralai/codestral-2508",
|
|
195
|
-
"mistral-nemo:12b": "mistralai/mistral-nemo",
|
|
196
|
-
"mixtral:8x22b": "mistralai/mixtral-8x22b-instruct",
|
|
197
|
-
"mistral-small3.2:24b": "mistralai/mistral-small-3.2-24b-instruct",
|
|
198
|
-
"nova-micro": "amazon/nova-micro-v1",
|
|
199
|
-
"nova-lite": "amazon/nova-lite-v1",
|
|
200
|
-
"nova-pro": "amazon/nova-pro-v1",
|
|
201
|
-
"claude-opus-4-1": "anthropic/claude-opus-4.1",
|
|
202
|
-
"claude-sonnet-4-5": "anthropic/claude-sonnet-4.5",
|
|
203
|
-
"claude-sonnet-4-0": "anthropic/claude-sonnet-4",
|
|
204
|
-
"gpt-5": "openai/gpt-5",
|
|
205
|
-
"gpt-5-chat": "openai/gpt-5-chat",
|
|
206
|
-
"gpt-5-mini": "openai/gpt-5-mini",
|
|
207
|
-
"gpt-5-nano": "openai/gpt-5-nano",
|
|
208
|
-
"gpt-5-codex": "openai/gpt-5-codex",
|
|
209
|
-
"gpt-oss:120b": "openai/gpt-oss-120b",
|
|
210
|
-
"gpt-oss:20b": "openai/gpt-oss-20b",
|
|
211
|
-
"gpt-4o": "openai/gpt-4o",
|
|
212
|
-
"gpt-4o-mini": "openai/gpt-4o-mini",
|
|
213
|
-
"gpt-4.1": "openai/gpt-4.1",
|
|
214
|
-
"gpt-4.1-mini": "openai/gpt-4.1-mini",
|
|
215
|
-
"gpt-4.1-nano": "openai/gpt-4.1-nano",
|
|
216
|
-
"o4-mini": "openai/o4-mini",
|
|
217
|
-
"o4-mini-high": "openai/o4-mini-high",
|
|
218
|
-
"grok-4": "x-ai/grok-4",
|
|
219
|
-
"grok-4-fast": "x-ai/grok-4-fast",
|
|
220
|
-
"grok-code-fast-1": "x-ai/grok-code-fast-1",
|
|
221
|
-
"glm-4.6": "z-ai/glm-4.6",
|
|
222
|
-
"glm-4.5v": "z-ai/glm-4.5v",
|
|
223
|
-
"glm-4.5": "z-ai/glm-4.5",
|
|
224
|
-
"glm-4.5-air": "z-ai/glm-4.5-air",
|
|
225
|
-
"kimi-k2": "moonshotai/kimi-k2",
|
|
226
|
-
"deepseek-v3.1:671b": "deepseek/deepseek-chat",
|
|
227
|
-
"deepseek-v3.2-exp": "deepseek/deepseek-v3.2-exp",
|
|
228
|
-
"deepseek-chat-v3.1:671b": "deepseek/deepseek-chat-v3.1:free",
|
|
229
|
-
"deepseek-r1:671b": "deepseek/deepseek-r1",
|
|
230
|
-
"deepseek-v3.1-terminus": "deepseek/deepseek-v3.1-terminus",
|
|
231
|
-
"qwen3:8b": "qwen/qwen3-8b:free",
|
|
232
|
-
"qwen3:30b": "qwen/qwen3-30b-a3b",
|
|
233
|
-
"qwen3:32b": "qwen/qwen3-32b",
|
|
234
|
-
"qwen3:235b": "qwen/qwen3-235b-a22b",
|
|
235
|
-
"qwen3-coder": "qwen/qwen3-coder",
|
|
236
|
-
"qwen3-coder-flash": "qwen/qwen3-coder-flash",
|
|
237
|
-
"qwen3-coder-plus": "qwen/qwen3-coder-plus",
|
|
238
|
-
"qwen3-coder:30b": "qwen/qwen3-coder-30b-a3b-instruct",
|
|
239
|
-
"qwen3-max": "qwen/qwen3-max",
|
|
240
|
-
"qwen3-vl:235b": "qwen/qwen3-vl-235b-a22b-instruct",
|
|
241
|
-
"qwen3-vl-thinking:235b": "qwen/qwen3-vl-235b-a22b-thinking",
|
|
242
|
-
"llama4:109b": "meta-llama/llama-4-scout",
|
|
243
|
-
"llama4:400b": "meta-llama/llama-4-maverick"
|
|
244
|
-
}
|
|
245
|
-
},
|
|
246
|
-
"google": {
|
|
247
|
-
"enabled": false,
|
|
248
|
-
"type": "GoogleProvider",
|
|
249
|
-
"api_key": "$GOOGLE_API_KEY",
|
|
250
|
-
"models": {
|
|
251
|
-
"gemini-flash-latest": "gemini-flash-latest",
|
|
252
|
-
"gemini-flash-lite-latest": "gemini-flash-lite-latest",
|
|
253
|
-
"gemini-2.5-pro": "gemini-2.5-pro",
|
|
254
|
-
"gemini-2.5-flash": "gemini-2.5-flash",
|
|
255
|
-
"gemini-2.5-flash-lite": "gemini-2.5-flash-lite"
|
|
256
|
-
},
|
|
257
|
-
"safety_settings": [
|
|
258
|
-
{
|
|
259
|
-
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
|
|
260
|
-
"threshold": "BLOCK_ONLY_HIGH"
|
|
261
|
-
}
|
|
262
|
-
],
|
|
263
|
-
"thinking_config": {
|
|
264
|
-
"thinkingBudget": 1024,
|
|
265
|
-
"includeThoughts": true
|
|
266
|
-
}
|
|
267
|
-
},
|
|
268
|
-
"anthropic": {
|
|
269
|
-
"enabled": false,
|
|
270
|
-
"type": "OpenAiProvider",
|
|
271
|
-
"base_url": "https://api.anthropic.com",
|
|
272
|
-
"api_key": "$ANTHROPIC_API_KEY",
|
|
273
|
-
"models": {
|
|
274
|
-
"claude-opus-4-1": "claude-opus-4-1",
|
|
275
|
-
"claude-opus-4": "claude-opus-4",
|
|
276
|
-
"claude-sonnet-4-5": "claude-sonnet-4-5",
|
|
277
|
-
"claude-sonnet-4-0": "claude-sonnet-4-0",
|
|
278
|
-
"claude-3-7-sonnet": "claude-3-7-sonnet-latest",
|
|
279
|
-
"claude-3-5-haiku": "claude-3-5-haiku-latest",
|
|
280
|
-
"claude-3-haiku": "claude-3-haiku-20240307"
|
|
281
|
-
}
|
|
282
|
-
},
|
|
283
|
-
"openai": {
|
|
284
|
-
"enabled": false,
|
|
285
|
-
"type": "OpenAiProvider",
|
|
286
|
-
"base_url": "https://api.openai.com",
|
|
287
|
-
"api_key": "$OPENAI_API_KEY",
|
|
288
|
-
"models": {
|
|
289
|
-
"gpt-5-codex": "gpt-5-codex",
|
|
290
|
-
"gpt-audio": "gpt-audio",
|
|
291
|
-
"gpt-realtime": "gpt-realtime",
|
|
292
|
-
"gpt-5-nano": "gpt-5-nano",
|
|
293
|
-
"gpt-5-mini": "gpt-5-mini",
|
|
294
|
-
"gpt-5": "gpt-5",
|
|
295
|
-
"gpt-5-chat-latest": "gpt-5-chat-latest",
|
|
296
|
-
"o4-mini-deep-research": "o4-mini-deep-research",
|
|
297
|
-
"codex-mini-latest": "codex-mini-latest",
|
|
298
|
-
"gpt-image-1": "gpt-image-1",
|
|
299
|
-
"gpt-4.1-nano": "gpt-4.1-nano",
|
|
300
|
-
"gpt-4.1-mini": "gpt-4.1-mini",
|
|
301
|
-
"gpt-4.1": "gpt-4.1",
|
|
302
|
-
"o4-mini": "o4-mini",
|
|
303
|
-
"o3": "o3",
|
|
304
|
-
"gpt-4o-mini-tts": "gpt-4o-mini-tts",
|
|
305
|
-
"o1-pro": "o1-pro",
|
|
306
|
-
"gpt-4o-mini-transcribe": "gpt-4o-mini-transcribe",
|
|
307
|
-
"gpt-4o-transcribe": "gpt-4o-transcribe",
|
|
308
|
-
"gpt-4o-mini-search-preview": "gpt-4o-mini-search-preview",
|
|
309
|
-
"gpt-4o-search-preview": "gpt-4o-search-preview",
|
|
310
|
-
"o3-mini": "o3-mini",
|
|
311
|
-
"o1": "o1",
|
|
312
|
-
"omni-moderation-latest": "omni-moderation-latest",
|
|
313
|
-
"gpt-4o-realtime-preview": "gpt-4o-realtime-preview",
|
|
314
|
-
"gpt-4o-audio-preview": "gpt-4o-audio-preview",
|
|
315
|
-
"gpt-4o-mini-audio-preview": "gpt-4o-mini-audio-preview",
|
|
316
|
-
"o1-mini": "o1-mini",
|
|
317
|
-
"chatgpt-4o-latest": "chatgpt-4o-latest",
|
|
318
|
-
"gpt-4o-mini": "gpt-4o-mini",
|
|
319
|
-
"gpt-4o": "gpt-4o",
|
|
320
|
-
"gpt-4-turbo": "gpt-4-turbo",
|
|
321
|
-
"text-embedding-3-large": "text-embedding-3-large",
|
|
322
|
-
"text-embedding-3-small": "text-embedding-3-small",
|
|
323
|
-
"tts-1-hd": "tts-1-hd",
|
|
324
|
-
"gpt-3.5-turbo-instruct": "gpt-3.5-turbo-instruct",
|
|
325
|
-
"babbage-002": "babbage-002",
|
|
326
|
-
"davinci-002": "davinci-002",
|
|
327
|
-
"gpt-4": "gpt-4",
|
|
328
|
-
"tts-1": "tts-1",
|
|
329
|
-
"gpt-3.5-turbo": "gpt-3.5-turbo"
|
|
330
|
-
}
|
|
331
|
-
},
|
|
332
|
-
"grok": {
|
|
333
|
-
"enabled": false,
|
|
334
|
-
"type": "OpenAiProvider",
|
|
335
|
-
"base_url": "https://api.x.ai",
|
|
336
|
-
"api_key": "$GROK_API_KEY",
|
|
337
|
-
"models": {
|
|
338
|
-
"grok-4": "grok-4-0709",
|
|
339
|
-
"grok-code-fast-1": "grok-code-fast-1",
|
|
340
|
-
"grok-4-fast-reasoning": "grok-4-fast-reasoning",
|
|
341
|
-
"grok-4-fast-non-reasoning": "grok-4-fast-non-reasoning",
|
|
342
|
-
"grok-4-0709": "grok-4-0709",
|
|
343
|
-
"grok-3-mini": "grok-3-mini",
|
|
344
|
-
"grok-3": "grok-3"
|
|
345
|
-
}
|
|
346
|
-
},
|
|
347
|
-
"qwen": {
|
|
348
|
-
"enabled": false,
|
|
349
|
-
"type": "OpenAiProvider",
|
|
350
|
-
"base_url": "https://dashscope-intl.aliyuncs.com/compatible-mode",
|
|
351
|
-
"api_key": "$DASHSCOPE_API_KEY",
|
|
352
|
-
"models": {
|
|
353
|
-
"qwen2.5vl": "qwen2.5-vl-7b-instruct",
|
|
354
|
-
"qwen3-max": "qwen3-max",
|
|
355
|
-
"qwen-max": "qwen-max",
|
|
356
|
-
"qwen-plus": "qwen-plus",
|
|
357
|
-
"qwen-flash": "qwen-flash",
|
|
358
|
-
"qwq-plus": "qwq-plus",
|
|
359
|
-
"qwen-turbo": "qwen-turbo",
|
|
360
|
-
"qvq-max": "qvq-max",
|
|
361
|
-
"qwen-vl-max": "qwen-vl-max",
|
|
362
|
-
"qwen3-vl-plus": "qwen3-vl-plus",
|
|
363
|
-
"qwen-vl-plus": "qwen-vl-plus",
|
|
364
|
-
"qwen3-omni-flash": "qwen3-omni-flash",
|
|
365
|
-
"qwen-omni-turbo": "qwen-omni-turbo",
|
|
366
|
-
"qwen3-omni-flash-realtime": "qwen3-omni-flash-realtime",
|
|
367
|
-
"qwen-omni-turbo-realtime": "qwen-omni-turbo-realtime",
|
|
368
|
-
"qwen3-omni-captioner:30b": "qwen3-omni-30b-a3b-captioner",
|
|
369
|
-
"qwen-vl-ocr": "qwen-vl-ocr",
|
|
370
|
-
"qwen3-asr-flash": "qwen3-asr-flash",
|
|
371
|
-
"qwen3-coder-plus": "qwen3-coder-plus",
|
|
372
|
-
"qwen3-coder-flash": "qwen3-coder-flash",
|
|
373
|
-
"qwen-plus-character-ja": "qwen-plus-character-ja",
|
|
374
|
-
"qwen3-next-thinking:80b": "qwen3-next-80b-a3b-thinking",
|
|
375
|
-
"qwen3-next:80b": "qwen3-next-80b-a3b-instruct",
|
|
376
|
-
"qwen3:235b": "qwen3-235b-a22b",
|
|
377
|
-
"qwen3:32b": "qwen3-32b",
|
|
378
|
-
"qwen3:30b": "qwen3-30b-a3b",
|
|
379
|
-
"qwen3:14b": "qwen3-14b",
|
|
380
|
-
"qwen3:8b": "qwen3-8b",
|
|
381
|
-
"qwen3:4b": "qwen3-4b",
|
|
382
|
-
"qwen3:1.7b": "qwen3-1.7b",
|
|
383
|
-
"qwen3:0.6b": "qwen3-0.6b",
|
|
384
|
-
"qwen2.5:72b": "qwen2.5-72b-instruct",
|
|
385
|
-
"qwen2.5:32b": "qwen2.5-32b-instruct",
|
|
386
|
-
"qwen2.5:14b": "qwen2.5-14b-instruct",
|
|
387
|
-
"qwen2.5:7b": "qwen2.5-7b-instruct",
|
|
388
|
-
"qwen3-coder": "qwen3-coder-480b-a35b-instruct",
|
|
389
|
-
"qwen3-coder:30b": "qwen3-coder-30b-a3b-instruct",
|
|
390
|
-
"qwen3-vl-thinking:235b": "qwen3-vl-235b-a22b-thinking",
|
|
391
|
-
"qwen3-vl:235b": "qwen3-vl-235b-a22b-instruct",
|
|
392
|
-
"qwen2.5-vl:72b": "qwen2.5-vl-72b-instruct",
|
|
393
|
-
"qwen2.5-vl:32b": "qwen2.5-vl-32b-instruct",
|
|
394
|
-
"qwen2.5-vl:7b": "qwen2.5-vl-7b-instruct",
|
|
395
|
-
"qwen2.5-vl:3b": "qwen2.5-vl-3b-instruct",
|
|
396
|
-
"qwen2.5-omni:7b": "qwen2.5-omni-7b"
|
|
397
|
-
},
|
|
398
|
-
"enable_thinking": false
|
|
399
|
-
},
|
|
400
|
-
"z.ai": {
|
|
401
|
-
"enabled": false,
|
|
402
|
-
"type": "OpenAiProvider",
|
|
403
|
-
"base_url": "https://api.z.ai/api/paas/v4",
|
|
404
|
-
"api_key": "$ZAI_API_KEY",
|
|
405
|
-
"models": {
|
|
406
|
-
"glm-4.6": "glm-4.6",
|
|
407
|
-
"glm-4.5": "glm-4.5",
|
|
408
|
-
"glm-4.5-air": "glm-4.5-air",
|
|
409
|
-
"glm-4.5-x": "glm-4.5-x",
|
|
410
|
-
"glm-4.5-airx": "glm-4.5-airx",
|
|
411
|
-
"glm-4.5-flash": "glm-4.5-flash",
|
|
412
|
-
"glm-4:32b": "glm-4-32b-0414-128k"
|
|
413
|
-
},
|
|
414
|
-
"temperature": 0.7
|
|
415
|
-
},
|
|
416
|
-
"mistral": {
|
|
417
|
-
"enabled": false,
|
|
418
|
-
"type": "OpenAiProvider",
|
|
419
|
-
"base_url": "https://api.mistral.ai",
|
|
420
|
-
"api_key": "$MISTRAL_API_KEY",
|
|
421
|
-
"models": {
|
|
422
|
-
"mistral-medium": "mistral-medium-latest",
|
|
423
|
-
"magistral-medium": "magistral-medium-latest",
|
|
424
|
-
"devstral-medium": "devstral-medium-2507",
|
|
425
|
-
"codestral:22b": "codestral-latest",
|
|
426
|
-
"mistral-ocr": "mistral-ocr-latest",
|
|
427
|
-
"mistral-small3.2:24b": "mistral-small-latest",
|
|
428
|
-
"magistral-small": "magistral-small-latest",
|
|
429
|
-
"devstral-small": "devstral-small-2507",
|
|
430
|
-
"voxtral-small": "voxtral-small-latest",
|
|
431
|
-
"voxtral-mini": "voxtral-mini-latest",
|
|
432
|
-
"codestral-embed": "codestral-embed-2505",
|
|
433
|
-
"mistral-embed": "mistral-embed",
|
|
434
|
-
"mistral-large:123b": "mistral-large-latest",
|
|
435
|
-
"pixtral-large:124b": "pixtral-large-latest",
|
|
436
|
-
"pixtral:12b": "pixtral-12b",
|
|
437
|
-
"mistral-nemo:12b": "open-mistral-nemo",
|
|
438
|
-
"mistral-saba": "mistral-saba-latest",
|
|
439
|
-
"mistral:7b": "open-mistral-7b",
|
|
440
|
-
"mixtral:8x7b": "open-mixtral-8x7b",
|
|
441
|
-
"mixtral:8x22b": "open-mixtral-8x22b",
|
|
442
|
-
"ministral:8b": "ministral-8b-latest",
|
|
443
|
-
"ministral:3b": "ministral-3b-latest"
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
aiohttp
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import Sidebar from "./Sidebar.mjs"
|
|
2
|
-
|
|
3
|
-
export default {
|
|
4
|
-
components: {
|
|
5
|
-
Sidebar,
|
|
6
|
-
},
|
|
7
|
-
template: `
|
|
8
|
-
<div class="flex h-screen bg-white">
|
|
9
|
-
<!-- Sidebar -->
|
|
10
|
-
<div class="w-72 xl:w-80 flex-shrink-0">
|
|
11
|
-
<Sidebar />
|
|
12
|
-
</div>
|
|
13
|
-
|
|
14
|
-
<!-- Main Area -->
|
|
15
|
-
<div class="flex-1 flex flex-col">
|
|
16
|
-
<RouterView />
|
|
17
|
-
</div>
|
|
18
|
-
</div>
|
|
19
|
-
`,
|
|
20
|
-
}
|