llms-py 3.0.0__py3-none-any.whl → 3.0.0b1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. llms/index.html +77 -35
  2. llms/llms.json +23 -72
  3. llms/main.py +732 -1786
  4. llms/providers.json +1 -1
  5. llms/{extensions/analytics/ui/index.mjs → ui/Analytics.mjs} +238 -154
  6. llms/ui/App.mjs +60 -151
  7. llms/ui/Avatar.mjs +85 -0
  8. llms/ui/Brand.mjs +52 -0
  9. llms/ui/ChatPrompt.mjs +606 -0
  10. llms/ui/Main.mjs +873 -0
  11. llms/ui/ModelSelector.mjs +693 -0
  12. llms/ui/OAuthSignIn.mjs +92 -0
  13. llms/ui/ProviderIcon.mjs +36 -0
  14. llms/ui/ProviderStatus.mjs +105 -0
  15. llms/{extensions/app/ui → ui}/Recents.mjs +65 -91
  16. llms/ui/{modules/chat/SettingsDialog.mjs → SettingsDialog.mjs} +9 -9
  17. llms/{extensions/app/ui/index.mjs → ui/Sidebar.mjs} +58 -124
  18. llms/ui/SignIn.mjs +64 -0
  19. llms/ui/SystemPromptEditor.mjs +31 -0
  20. llms/ui/SystemPromptSelector.mjs +56 -0
  21. llms/ui/Welcome.mjs +8 -0
  22. llms/ui/ai.mjs +53 -125
  23. llms/ui/app.css +111 -1837
  24. llms/ui/lib/charts.mjs +13 -9
  25. llms/ui/lib/servicestack-vue.mjs +3 -3
  26. llms/ui/lib/vue.min.mjs +9 -10
  27. llms/ui/lib/vue.mjs +1602 -1763
  28. llms/ui/markdown.mjs +2 -10
  29. llms/ui/tailwind.input.css +80 -496
  30. llms/ui/threadStore.mjs +572 -0
  31. llms/ui/utils.mjs +117 -113
  32. llms/ui.json +1069 -0
  33. {llms_py-3.0.0.dist-info → llms_py-3.0.0b1.dist-info}/METADATA +1 -1
  34. llms_py-3.0.0b1.dist-info/RECORD +49 -0
  35. llms/__pycache__/__init__.cpython-312.pyc +0 -0
  36. llms/__pycache__/__init__.cpython-313.pyc +0 -0
  37. llms/__pycache__/__init__.cpython-314.pyc +0 -0
  38. llms/__pycache__/__main__.cpython-312.pyc +0 -0
  39. llms/__pycache__/__main__.cpython-314.pyc +0 -0
  40. llms/__pycache__/llms.cpython-312.pyc +0 -0
  41. llms/__pycache__/main.cpython-312.pyc +0 -0
  42. llms/__pycache__/main.cpython-313.pyc +0 -0
  43. llms/__pycache__/main.cpython-314.pyc +0 -0
  44. llms/__pycache__/plugins.cpython-314.pyc +0 -0
  45. llms/extensions/app/README.md +0 -20
  46. llms/extensions/app/__init__.py +0 -530
  47. llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
  48. llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
  49. llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
  50. llms/extensions/app/db.py +0 -644
  51. llms/extensions/app/db_manager.py +0 -195
  52. llms/extensions/app/requests.json +0 -9073
  53. llms/extensions/app/threads.json +0 -15290
  54. llms/extensions/app/ui/threadStore.mjs +0 -411
  55. llms/extensions/core_tools/CALCULATOR.md +0 -32
  56. llms/extensions/core_tools/__init__.py +0 -598
  57. llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
  58. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +0 -201
  59. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +0 -185
  60. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +0 -101
  61. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +0 -160
  62. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +0 -66
  63. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +0 -27
  64. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +0 -72
  65. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +0 -119
  66. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +0 -98
  67. llms/extensions/core_tools/ui/codemirror/doc/docs.css +0 -225
  68. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  69. llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +0 -344
  70. llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +0 -9884
  71. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +0 -942
  72. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +0 -118
  73. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +0 -962
  74. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +0 -62
  75. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +0 -402
  76. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +0 -40
  77. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +0 -135
  78. llms/extensions/core_tools/ui/index.mjs +0 -650
  79. llms/extensions/gallery/README.md +0 -61
  80. llms/extensions/gallery/__init__.py +0 -61
  81. llms/extensions/gallery/__pycache__/__init__.cpython-314.pyc +0 -0
  82. llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
  83. llms/extensions/gallery/db.py +0 -298
  84. llms/extensions/gallery/ui/index.mjs +0 -482
  85. llms/extensions/katex/README.md +0 -39
  86. llms/extensions/katex/__init__.py +0 -6
  87. llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
  88. llms/extensions/katex/ui/README.md +0 -125
  89. llms/extensions/katex/ui/contrib/auto-render.js +0 -338
  90. llms/extensions/katex/ui/contrib/auto-render.min.js +0 -1
  91. llms/extensions/katex/ui/contrib/auto-render.mjs +0 -244
  92. llms/extensions/katex/ui/contrib/copy-tex.js +0 -127
  93. llms/extensions/katex/ui/contrib/copy-tex.min.js +0 -1
  94. llms/extensions/katex/ui/contrib/copy-tex.mjs +0 -105
  95. llms/extensions/katex/ui/contrib/mathtex-script-type.js +0 -109
  96. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +0 -1
  97. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +0 -24
  98. llms/extensions/katex/ui/contrib/mhchem.js +0 -3213
  99. llms/extensions/katex/ui/contrib/mhchem.min.js +0 -1
  100. llms/extensions/katex/ui/contrib/mhchem.mjs +0 -3109
  101. llms/extensions/katex/ui/contrib/render-a11y-string.js +0 -887
  102. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +0 -1
  103. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +0 -800
  104. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  115. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  116. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  117. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  118. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  119. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  120. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  121. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  122. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  123. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  124. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  125. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  126. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  127. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  128. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  129. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  130. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  131. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  132. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  133. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  134. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  135. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  136. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  137. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  138. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  139. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  140. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  141. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  142. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  143. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  144. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  145. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  146. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  147. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  148. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  149. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  150. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  151. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  152. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  153. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  154. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  155. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  156. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  157. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  158. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  159. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  160. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  161. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  162. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  163. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  164. llms/extensions/katex/ui/index.mjs +0 -92
  165. llms/extensions/katex/ui/katex-swap.css +0 -1230
  166. llms/extensions/katex/ui/katex-swap.min.css +0 -1
  167. llms/extensions/katex/ui/katex.css +0 -1230
  168. llms/extensions/katex/ui/katex.js +0 -19080
  169. llms/extensions/katex/ui/katex.min.css +0 -1
  170. llms/extensions/katex/ui/katex.min.js +0 -1
  171. llms/extensions/katex/ui/katex.min.mjs +0 -1
  172. llms/extensions/katex/ui/katex.mjs +0 -18547
  173. llms/extensions/providers/__init__.py +0 -18
  174. llms/extensions/providers/__pycache__/__init__.cpython-314.pyc +0 -0
  175. llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  176. llms/extensions/providers/__pycache__/chutes.cpython-314.pyc +0 -0
  177. llms/extensions/providers/__pycache__/google.cpython-314.pyc +0 -0
  178. llms/extensions/providers/__pycache__/nvidia.cpython-314.pyc +0 -0
  179. llms/extensions/providers/__pycache__/openai.cpython-314.pyc +0 -0
  180. llms/extensions/providers/__pycache__/openrouter.cpython-314.pyc +0 -0
  181. llms/extensions/providers/anthropic.py +0 -229
  182. llms/extensions/providers/chutes.py +0 -155
  183. llms/extensions/providers/google.py +0 -378
  184. llms/extensions/providers/nvidia.py +0 -105
  185. llms/extensions/providers/openai.py +0 -156
  186. llms/extensions/providers/openrouter.py +0 -72
  187. llms/extensions/system_prompts/README.md +0 -22
  188. llms/extensions/system_prompts/__init__.py +0 -45
  189. llms/extensions/system_prompts/__pycache__/__init__.cpython-314.pyc +0 -0
  190. llms/extensions/system_prompts/ui/index.mjs +0 -280
  191. llms/extensions/system_prompts/ui/prompts.json +0 -1067
  192. llms/extensions/tools/__init__.py +0 -5
  193. llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  194. llms/extensions/tools/ui/index.mjs +0 -204
  195. llms/providers-extra.json +0 -356
  196. llms/ui/ctx.mjs +0 -365
  197. llms/ui/index.mjs +0 -129
  198. llms/ui/modules/chat/ChatBody.mjs +0 -691
  199. llms/ui/modules/chat/index.mjs +0 -828
  200. llms/ui/modules/layout.mjs +0 -243
  201. llms/ui/modules/model-selector.mjs +0 -851
  202. llms_py-3.0.0.dist-info/RECORD +0 -202
  203. {llms_py-3.0.0.dist-info → llms_py-3.0.0b1.dist-info}/WHEEL +0 -0
  204. {llms_py-3.0.0.dist-info → llms_py-3.0.0b1.dist-info}/entry_points.txt +0 -0
  205. {llms_py-3.0.0.dist-info → llms_py-3.0.0b1.dist-info}/licenses/LICENSE +0 -0
  206. {llms_py-3.0.0.dist-info → llms_py-3.0.0b1.dist-info}/top_level.txt +0 -0
@@ -1,5 +0,0 @@
1
- from aiohttp import web
2
-
3
-
4
- def install(ctx):
5
- ctx.add_get("/", lambda r: web.json_response(ctx.app.tool_definitions))
@@ -1,204 +0,0 @@
1
- import { inject, computed } from "vue"
2
-
3
- const Tools = {
4
- template: `
5
- <div class="p-4 md:p-6 max-w-7xl mx-auto w-full">
6
- <div class="mb-6">
7
- <h1 class="text-2xl font-bold text-gray-900 dark:text-gray-100">Tools</h1>
8
- <p class="text-gray-600 dark:text-gray-400 mt-1">
9
- {{ ($state.tools || []).length }} tools available
10
- </p>
11
- </div>
12
-
13
- <div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
14
- <div v-for="tool in (Array.isArray($state.tools) ? $state.tools : []).filter(x => x.function)" :key="tool.function.name"
15
- class="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col">
16
-
17
- <div class="p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
18
- <div class="font-bold text-lg text-gray-900 dark:text-gray-100 font-mono break-all">
19
- {{ tool.function.name }}
20
- </div>
21
- </div>
22
-
23
- <div class="p-4 flex-1 flex flex-col">
24
- <p v-if="tool.function.description" class="text-sm text-gray-600 dark:text-gray-300 mb-4 flex-1">
25
- {{ tool.function.description }}
26
- </p>
27
- <p v-else class="text-sm text-gray-400 italic mb-4 flex-1">
28
- No description provided
29
- </p>
30
-
31
- <div v-if="tool.function.parameters?.properties && Object.keys(tool.function.parameters.properties).length > 0">
32
- <div class="text-xs font-semibold text-gray-500 uppercase tracking-wider mb-2">Parameters</div>
33
- <div class="space-y-3">
34
- <div v-for="(prop, name) in tool.function.parameters.properties" :key="name" class="text-sm bg-gray-50 dark:bg-gray-700/30 rounded p-2">
35
- <div class="flex flex-wrap items-baseline gap-2 mb-1">
36
- <span class="font-mono font-medium text-blue-600 dark:text-blue-400">{{ name }}</span>
37
- <span class="text-gray-500 text-xs">({{ prop.type }})</span>
38
- <span v-if="tool.function.parameters.required?.includes(name)"
39
- class="px-1.5 py-0.5 text-[10px] rounded bg-red-100 dark:bg-red-900/30 text-red-600 dark:text-red-400 font-medium">
40
- REQUIRED
41
- </span>
42
- </div>
43
- <div v-if="prop.description" class="text-gray-600 dark:text-gray-400 text-xs">
44
- {{ prop.description }}
45
- </div>
46
- </div>
47
- </div>
48
- </div>
49
- <div v-else class="text-sm text-gray-400 italic border-t border-gray-100 dark:border-gray-700 pt-2 mt-auto">
50
- No parameters
51
- </div>
52
- </div>
53
- </div>
54
- </div>
55
- </div>
56
- `,
57
- setup() {
58
-
59
- }
60
- }
61
-
62
- const ToolSelector = {
63
- template: `
64
- <div class="px-4 py-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700">
65
- <div class="flex flex-wrap items-center gap-2 text-sm">
66
-
67
- <!-- All -->
68
- <button @click="$ctx.setPrefs({ onlyTools: null })"
69
- class="px-2.5 py-1 rounded-full text-xs font-medium border transition-colors select-none"
70
- :class="$prefs.onlyTools == null
71
- ? 'bg-green-100 dark:bg-green-900/40 text-green-800 dark:text-green-300 border-green-200 dark:border-green-800'
72
- : 'cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:border-gray-700 dark:text-gray-400 border-gray-200 dark:hover:border-gray-600 hover:border-gray-300'">
73
- All
74
- </button>
75
-
76
- <!-- None -->
77
- <button @click="$ctx.setPrefs({ onlyTools:[] })"
78
- class="px-2.5 py-1 rounded-full text-xs font-medium border transition-colors select-none"
79
- :class="$prefs.onlyTools?.length === 0
80
- ? 'bg-fuchsia-100 dark:bg-fuchsia-900/40 text-fuchsia-800 dark:text-fuchsia-300 border-fuchsia-200 dark:border-fuchsia-800'
81
- : 'cursor-pointer bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
82
- None
83
- </button>
84
-
85
- <div class="border-l h-4"></div>
86
-
87
- <!-- Tools -->
88
- <button v-for="tool in availableTools" :key="tool.function.name" type="button"
89
- @click="toggleTool(tool.function.name)"
90
- :title="tool.function.description"
91
- class="px-2.5 py-1 rounded-full text-xs font-medium border transition-colors select-none"
92
- :class="isToolActive(tool.function.name)
93
- ? 'bg-blue-100 dark:bg-blue-900/40 text-blue-800 dark:text-blue-300 border-blue-200 dark:border-blue-800'
94
- : 'bg-white dark:bg-gray-800 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-700 hover:border-gray-300 dark:hover:border-gray-600'">
95
- {{ tool.function.name }}
96
- </button>
97
- </div>
98
- </div>
99
- `,
100
- setup() {
101
- const ctx = inject('ctx')
102
-
103
- const availableTools = computed(() => (Array.isArray(ctx.state.tools) ? ctx.state.tools : []).filter(x => x.function))
104
-
105
- function isToolActive(name) {
106
- const only = ctx.prefs.onlyTools
107
- if (only == null) return true
108
- if (Array.isArray(only)) return only.includes(name)
109
- return false
110
- }
111
-
112
- function toggleTool(name) {
113
- let onlyTools = ctx.prefs.onlyTools
114
-
115
- // If currently 'All', clicking a tool means we enter custom mode with all OTHER tools selected (deselecting clicked)
116
- if (onlyTools == null) {
117
- onlyTools = availableTools.value.map(t => t.function.name).filter(t => t !== name)
118
- } else {
119
- // Currently Custom or None
120
- if (onlyTools.includes(name)) {
121
- onlyTools = onlyTools.filter(t => t !== name)
122
- } else {
123
- onlyTools = [...onlyTools, name]
124
- }
125
- }
126
-
127
- ctx.setPrefs({ onlyTools })
128
- }
129
-
130
- return {
131
- availableTools,
132
- isToolActive,
133
- toggleTool
134
- }
135
- }
136
- }
137
-
138
- export default {
139
- order: 10 - 100,
140
-
141
- install(ctx) {
142
-
143
- ctx.components({
144
- Tools,
145
- ToolSelector,
146
- })
147
-
148
- const svg = (attrs, title) => `<svg ${attrs} xmlns="http://www.w4.org/2000/svg" viewBox="0 0 24 24">${title ? "<title>" + title + "</title>" : ''}<path fill="currentColor" d="M5.33 3.272a3.5 3.5 0 0 1 4.472 4.473L20.647 18.59l-2.122 2.122L7.68 9.867a3.5 3.5 0 0 1-4.472-4.474L5.444 7.63a1.5 1.5 0 0 0 2.121-2.121zm10.367 1.883l3.182-1.768l1.414 1.415l-1.768 3.182l-1.768.353l-2.12 2.121l-1.415-1.414l2.121-2.121zm-7.071 7.778l2.121 2.122l-4.95 4.95A1.5 1.5 0 0 1 3.58 17.99l.097-.107z" /></svg>`
149
-
150
- ctx.setLeftIcons({
151
- tools: {
152
- component: {
153
- template: svg(`@click="$ctx.togglePath('/tools')"`),
154
- },
155
- isActive({ path }) {
156
- return path === '/tools'
157
- }
158
- }
159
- })
160
-
161
- ctx.setTopIcons({
162
- tools: {
163
- component: {
164
- template: svg([
165
- `@click="$ctx.toggleTop('ToolSelector')"`,
166
- `:class="$prefs.onlyTools == null ? 'text-green-600 dark:text-green-300' : $prefs.onlyTools.length ? 'text-blue-600! dark:text-blue-300!' : ''"`
167
- ].join(' ')),
168
- // , "{{$prefs.onlyTools == null ? 'Include All Tools' : $prefs.onlyTools.length ? 'Include Selected Tools' : 'All Tools Excluded'}}"
169
- },
170
- isActive({ top }) {
171
- return top === 'ToolSelector'
172
- },
173
- get title() {
174
- return ctx.prefs.onlyTools == null
175
- ? `All Tools Included`
176
- : ctx.prefs.onlyTools.length
177
- ? `${ctx.prefs.onlyTools.length} ${ctx.utils.pluralize('Tool', ctx.prefs.onlyTools.length)} Included`
178
- : 'No Tools Included'
179
- }
180
- }
181
- })
182
-
183
- ctx.chatRequestFilters.push(({ request, thread }) => {
184
- // Tool Preferences
185
- const prefs = ctx.prefs
186
- if (prefs.onlyTools != null) {
187
- if (Array.isArray(prefs.onlyTools)) {
188
- request.metadata.tools = prefs.onlyTools.length > 0
189
- ? prefs.onlyTools.join(',')
190
- : 'none'
191
- }
192
- } else {
193
- request.metadata.tools = 'all'
194
- }
195
- })
196
-
197
- ctx.routes.push({ path: '/tools', component: Tools, meta: { title: 'View Tools' } })
198
- },
199
-
200
- async load(ctx) {
201
- const ext = ctx.scope('tools')
202
- ctx.state.tools = (await ext.getJson('/')).response || []
203
- }
204
- }
llms/providers-extra.json DELETED
@@ -1,356 +0,0 @@
1
- {
2
- "openrouter": {
3
- "models": {
4
- "google/gemini-2.5-flash-image": {
5
- "name": "Gemini 2.5 Flash Image (Nano Banana)",
6
- "modalities": {
7
- "input": [
8
- "text"
9
- ],
10
- "output": [
11
- "image"
12
- ]
13
- },
14
- "cost": {
15
- "input": 0.30,
16
- "output": 2.50
17
- }
18
- },
19
- "google/gemini-2.5-flash-image-preview": {
20
- "name": "Gemini 2.5 Flash Image Preview (Nano Banana)",
21
- "modalities": {
22
- "input": [
23
- "text"
24
- ],
25
- "output": [
26
- "image"
27
- ]
28
- },
29
- "cost": {
30
- "input": 0.30,
31
- "output": 2.50
32
- }
33
- },
34
- "google/gemini-3-pro-image-preview": {
35
- "name": "Google: Nano Banana Pro Preview (Gemini 3 Pro)",
36
- "modalities": {
37
- "input": [
38
- "text"
39
- ],
40
- "output": [
41
- "image"
42
- ]
43
- },
44
- "cost": {
45
- "input": 2.0,
46
- "output": 12.0
47
- }
48
- },
49
- "sourceful/riverflow-v2-fast-preview": {
50
- "name": "Sourceful: Riverflow V2 Fast Preview",
51
- "modalities": {
52
- "input": [
53
- "text"
54
- ],
55
- "output": [
56
- "image"
57
- ]
58
- },
59
- "cost": {
60
- "input": 0,
61
- "output": 7.19
62
- }
63
- },
64
- "sourceful/riverflow-v2-standard-preview": {
65
- "name": "Sourceful: Riverflow V2 Standard Preview",
66
- "modalities": {
67
- "input": [
68
- "text"
69
- ],
70
- "output": [
71
- "image"
72
- ]
73
- },
74
- "cost": {
75
- "input": 0,
76
- "output": 8.38
77
- }
78
- },
79
- "sourceful/riverflow-v2-max-preview": {
80
- "name": "Sourceful: Riverflow V2 Max Preview",
81
- "modalities": {
82
- "input": [
83
- "text"
84
- ],
85
- "output": [
86
- "image"
87
- ]
88
- },
89
- "cost": {
90
- "input": 0,
91
- "output": 17.96
92
- }
93
- },
94
- "openai/gpt-5-image-mini": {
95
- "name": "OpenAI: GPT-5 Image Mini",
96
- "modalities": {
97
- "input": [
98
- "text"
99
- ],
100
- "output": [
101
- "image"
102
- ]
103
- },
104
- "cost": {
105
- "input": 2.50,
106
- "output": 2
107
- }
108
- },
109
- "openai/gpt-5-image": {
110
- "name": "OpenAI: GPT-5 Image",
111
- "modalities": {
112
- "input": [
113
- "text"
114
- ],
115
- "output": [
116
- "image"
117
- ]
118
- },
119
- "cost": {
120
- "input": 10.0,
121
- "output": 10.0
122
- }
123
- },
124
- "black-forest-labs/flux.2-pro": {
125
- "name": "Black Forest Labs: FLUX.2 Pro",
126
- "modalities": {
127
- "input": [
128
- "text"
129
- ],
130
- "output": [
131
- "image"
132
- ]
133
- },
134
- "cost": {
135
- "input": 3.66,
136
- "output": 3.66
137
- }
138
- },
139
- "black-forest-labs/flux.2-max": {
140
- "name": "Black Forest Labs: FLUX.2 Max",
141
- "modalities": {
142
- "input": [
143
- "text"
144
- ],
145
- "output": [
146
- "image"
147
- ]
148
- },
149
- "cost": {
150
- "input": 7.32,
151
- "output": 7.32
152
- }
153
- },
154
- "black-forest-labs/flux.2-flex": {
155
- "name": "Black Forest Labs: FLUX.2 Flex",
156
- "modalities": {
157
- "input": [
158
- "text"
159
- ],
160
- "output": [
161
- "image"
162
- ]
163
- },
164
- "cost": {
165
- "input": 14.64,
166
- "output": 14.64
167
- }
168
- }
169
- }
170
- },
171
- "openai": {
172
- "models": {
173
- "chatgpt-image-latest": {
174
- "name": "ChatGPT Image Latest",
175
- "modalities": {
176
- "input": [
177
- "text"
178
- ],
179
- "output": [
180
- "image"
181
- ]
182
- },
183
- "cost": {
184
- "input": 5.0,
185
- "output": 32.0
186
- }
187
- },
188
- "gpt-image-1.5": {
189
- "name": "GPT Image 1.5",
190
- "modalities": {
191
- "input": [
192
- "text"
193
- ],
194
- "output": [
195
- "image"
196
- ]
197
- },
198
- "cost": {
199
- "input": 5.0,
200
- "output": 32.0
201
- }
202
- },
203
- "gpt-image-1": {
204
- "name": "GPT Image 1",
205
- "modalities": {
206
- "input": [
207
- "text"
208
- ],
209
- "output": [
210
- "image"
211
- ]
212
- },
213
- "cost": {
214
- "input": 5.0,
215
- "output": 40.0
216
- }
217
- },
218
- "gpt-image-1-mini": {
219
- "name": "GPT Image 1 Mini",
220
- "modalities": {
221
- "input": [
222
- "text"
223
- ],
224
- "output": [
225
- "image"
226
- ]
227
- },
228
- "cost": {
229
- "input": 5.0,
230
- "output": 8.0
231
- }
232
- }
233
- }
234
- },
235
- "chutes": {
236
- "models": {
237
- "chutes-z-image-turbo": {
238
- "name": "Z Image Turbo",
239
- "modalities": {
240
- "input": [
241
- "text"
242
- ],
243
- "output": [
244
- "image"
245
- ]
246
- }
247
- },
248
- "qwen-image": {
249
- "modalities": {
250
- "input": [
251
- "text"
252
- ],
253
- "output": [
254
- "image"
255
- ]
256
- }
257
- },
258
- "chutes-qwen-image-edit-2509": {
259
- "name": "Qwen Image Edit 2509",
260
- "modalities": {
261
- "input": [
262
- "text",
263
- "image"
264
- ],
265
- "output": [
266
- "image"
267
- ]
268
- }
269
- },
270
- "chutes-hidream": {
271
- "name": "Hidream",
272
- "modalities": {
273
- "input": [
274
- "text"
275
- ],
276
- "output": [
277
- "image"
278
- ]
279
- }
280
- },
281
- "chutes-hunyuan-image-3": {
282
- "name": "Hunyuan Image 3",
283
- "modalities": {
284
- "input": [
285
- "text"
286
- ],
287
- "output": [
288
- "image"
289
- ]
290
- }
291
- },
292
- "FLUX.1-schnell": {
293
- "name": "FLUX.1 Schnell",
294
- "modalities": {
295
- "input": [
296
- "text"
297
- ],
298
- "output": [
299
- "image"
300
- ]
301
- }
302
- },
303
- "chroma": {
304
- "modalities": {
305
- "input": [
306
- "text"
307
- ],
308
- "output": [
309
- "image"
310
- ]
311
- }
312
- },
313
- "JuggernautXL-Ragnarok": {
314
- "name": "JuggernautXL Ragnarok",
315
- "modalities": {
316
- "input": [
317
- "text"
318
- ],
319
- "output": [
320
- "image"
321
- ]
322
- }
323
- },
324
- "Animij": {
325
- "modalities": {
326
- "input": [
327
- "text"
328
- ],
329
- "output": [
330
- "image"
331
- ]
332
- }
333
- },
334
- "Illustrij": {
335
- "modalities": {
336
- "input": [
337
- "text"
338
- ],
339
- "output": [
340
- "image"
341
- ]
342
- }
343
- },
344
- "iLustMix": {
345
- "modalities": {
346
- "input": [
347
- "text"
348
- ],
349
- "output": [
350
- "image"
351
- ]
352
- }
353
- }
354
- }
355
- }
356
- }