llms-py 3.0.0b7__py3-none-any.whl → 3.0.0b8__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 (157) hide show
  1. llms/__pycache__/main.cpython-314.pyc +0 -0
  2. llms/extensions/analytics/ui/index.mjs +51 -162
  3. llms/extensions/app/__init__.py +519 -0
  4. llms/extensions/app/__pycache__/__init__.cpython-314.pyc +0 -0
  5. llms/extensions/app/__pycache__/db.cpython-314.pyc +0 -0
  6. llms/extensions/app/__pycache__/db_manager.cpython-314.pyc +0 -0
  7. llms/extensions/app/db.py +641 -0
  8. llms/extensions/app/db_manager.py +195 -0
  9. llms/extensions/app/requests.json +9073 -0
  10. llms/extensions/app/threads.json +15290 -0
  11. llms/{ui/modules/threads → extensions/app/ui}/Recents.mjs +82 -55
  12. llms/{ui/modules/threads → extensions/app/ui}/index.mjs +78 -9
  13. llms/extensions/app/ui/threadStore.mjs +407 -0
  14. llms/extensions/core_tools/__init__.py +272 -32
  15. llms/extensions/core_tools/__pycache__/__init__.cpython-314.pyc +0 -0
  16. llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js +201 -0
  17. llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js +185 -0
  18. llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js +101 -0
  19. llms/extensions/core_tools/ui/codemirror/addon/edit/matchbrackets.js +160 -0
  20. llms/extensions/core_tools/ui/codemirror/addon/edit/matchtags.js +66 -0
  21. llms/extensions/core_tools/ui/codemirror/addon/edit/trailingspace.js +27 -0
  22. llms/extensions/core_tools/ui/codemirror/addon/selection/active-line.js +72 -0
  23. llms/extensions/core_tools/ui/codemirror/addon/selection/mark-selection.js +119 -0
  24. llms/extensions/core_tools/ui/codemirror/addon/selection/selection-pointer.js +98 -0
  25. llms/extensions/core_tools/ui/codemirror/doc/docs.css +225 -0
  26. llms/extensions/core_tools/ui/codemirror/doc/source_sans.woff +0 -0
  27. llms/extensions/core_tools/ui/codemirror/lib/codemirror.css +344 -0
  28. llms/extensions/core_tools/ui/codemirror/lib/codemirror.js +9884 -0
  29. llms/extensions/core_tools/ui/codemirror/mode/clike/clike.js +942 -0
  30. llms/extensions/core_tools/ui/codemirror/mode/javascript/index.html +118 -0
  31. llms/extensions/core_tools/ui/codemirror/mode/javascript/javascript.js +962 -0
  32. llms/extensions/core_tools/ui/codemirror/mode/javascript/typescript.html +62 -0
  33. llms/extensions/core_tools/ui/codemirror/mode/python/python.js +402 -0
  34. llms/extensions/core_tools/ui/codemirror/theme/dracula.css +40 -0
  35. llms/extensions/core_tools/ui/codemirror/theme/mocha.css +135 -0
  36. llms/extensions/core_tools/ui/index.mjs +650 -0
  37. llms/extensions/gallery/__pycache__/db.cpython-314.pyc +0 -0
  38. llms/extensions/gallery/db.py +4 -4
  39. llms/extensions/gallery/ui/index.mjs +2 -1
  40. llms/extensions/katex/__init__.py +6 -0
  41. llms/extensions/katex/__pycache__/__init__.cpython-314.pyc +0 -0
  42. llms/extensions/katex/ui/README.md +125 -0
  43. llms/extensions/katex/ui/contrib/auto-render.js +338 -0
  44. llms/extensions/katex/ui/contrib/auto-render.min.js +1 -0
  45. llms/extensions/katex/ui/contrib/auto-render.mjs +244 -0
  46. llms/extensions/katex/ui/contrib/copy-tex.js +127 -0
  47. llms/extensions/katex/ui/contrib/copy-tex.min.js +1 -0
  48. llms/extensions/katex/ui/contrib/copy-tex.mjs +105 -0
  49. llms/extensions/katex/ui/contrib/mathtex-script-type.js +109 -0
  50. llms/extensions/katex/ui/contrib/mathtex-script-type.min.js +1 -0
  51. llms/extensions/katex/ui/contrib/mathtex-script-type.mjs +24 -0
  52. llms/extensions/katex/ui/contrib/mhchem.js +3213 -0
  53. llms/extensions/katex/ui/contrib/mhchem.min.js +1 -0
  54. llms/extensions/katex/ui/contrib/mhchem.mjs +3109 -0
  55. llms/extensions/katex/ui/contrib/render-a11y-string.js +887 -0
  56. llms/extensions/katex/ui/contrib/render-a11y-string.min.js +1 -0
  57. llms/extensions/katex/ui/contrib/render-a11y-string.mjs +800 -0
  58. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.ttf +0 -0
  59. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff +0 -0
  60. llms/extensions/katex/ui/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  61. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  62. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  63. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  64. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  65. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  66. llms/extensions/katex/ui/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  67. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  68. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  69. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  70. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  71. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  72. llms/extensions/katex/ui/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  73. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.ttf +0 -0
  74. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff +0 -0
  75. llms/extensions/katex/ui/fonts/KaTeX_Main-Bold.woff2 +0 -0
  76. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  77. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  78. llms/extensions/katex/ui/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  79. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.ttf +0 -0
  80. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff +0 -0
  81. llms/extensions/katex/ui/fonts/KaTeX_Main-Italic.woff2 +0 -0
  82. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.ttf +0 -0
  83. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff +0 -0
  84. llms/extensions/katex/ui/fonts/KaTeX_Main-Regular.woff2 +0 -0
  85. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  86. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  87. llms/extensions/katex/ui/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  88. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.ttf +0 -0
  89. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff +0 -0
  90. llms/extensions/katex/ui/fonts/KaTeX_Math-Italic.woff2 +0 -0
  91. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  92. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  93. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  94. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  95. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  96. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  97. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  98. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  99. llms/extensions/katex/ui/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  100. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.ttf +0 -0
  101. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff +0 -0
  102. llms/extensions/katex/ui/fonts/KaTeX_Script-Regular.woff2 +0 -0
  103. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.ttf +0 -0
  104. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff +0 -0
  105. llms/extensions/katex/ui/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  106. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.ttf +0 -0
  107. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff +0 -0
  108. llms/extensions/katex/ui/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  109. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.ttf +0 -0
  110. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff +0 -0
  111. llms/extensions/katex/ui/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  112. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.ttf +0 -0
  113. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff +0 -0
  114. llms/extensions/katex/ui/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  115. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  116. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  117. llms/extensions/katex/ui/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  118. llms/extensions/katex/ui/index.mjs +92 -0
  119. llms/extensions/katex/ui/katex-swap.css +1230 -0
  120. llms/extensions/katex/ui/katex-swap.min.css +1 -0
  121. llms/extensions/katex/ui/katex.css +1230 -0
  122. llms/extensions/katex/ui/katex.js +19080 -0
  123. llms/extensions/katex/ui/katex.min.css +1 -0
  124. llms/extensions/katex/ui/katex.min.js +1 -0
  125. llms/extensions/katex/ui/katex.min.mjs +1 -0
  126. llms/extensions/katex/ui/katex.mjs +18547 -0
  127. llms/extensions/providers/__pycache__/anthropic.cpython-314.pyc +0 -0
  128. llms/extensions/providers/anthropic.py +44 -1
  129. llms/extensions/system_prompts/ui/index.mjs +2 -1
  130. llms/extensions/tools/__init__.py +5 -0
  131. llms/extensions/tools/__pycache__/__init__.cpython-314.pyc +0 -0
  132. llms/extensions/tools/ui/index.mjs +8 -8
  133. llms/index.html +26 -38
  134. llms/llms.json +4 -1
  135. llms/main.py +492 -103
  136. llms/ui/App.mjs +2 -3
  137. llms/ui/ai.mjs +29 -13
  138. llms/ui/app.css +250 -398
  139. llms/ui/ctx.mjs +84 -6
  140. llms/ui/index.mjs +4 -6
  141. llms/ui/lib/vue.min.mjs +10 -9
  142. llms/ui/lib/vue.mjs +1796 -1635
  143. llms/ui/markdown.mjs +4 -2
  144. llms/ui/modules/chat/ChatBody.mjs +90 -86
  145. llms/ui/modules/chat/HomeTools.mjs +0 -242
  146. llms/ui/modules/chat/index.mjs +103 -170
  147. llms/ui/modules/model-selector.mjs +2 -2
  148. llms/ui/tailwind.input.css +35 -1
  149. llms/ui/utils.mjs +12 -0
  150. {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b8.dist-info}/METADATA +1 -1
  151. llms_py-3.0.0b8.dist-info/RECORD +198 -0
  152. llms/ui/modules/threads/threadStore.mjs +0 -640
  153. llms_py-3.0.0b7.dist-info/RECORD +0 -80
  154. {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b8.dist-info}/WHEEL +0 -0
  155. {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b8.dist-info}/entry_points.txt +0 -0
  156. {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b8.dist-info}/licenses/LICENSE +0 -0
  157. {llms_py-3.0.0b7.dist-info → llms_py-3.0.0b8.dist-info}/top_level.txt +0 -0
@@ -58,6 +58,23 @@ def install_anthropic(ctx):
58
58
  if message.get("role") == "system":
59
59
  continue
60
60
 
61
+ if message.get("role") == "tool":
62
+ # Convert OpenAI tool response to Anthropic tool_result
63
+ tool_call_id = message.get("tool_call_id")
64
+ content = ctx.to_content(message.get("content", ""))
65
+ if not isinstance(content, (str, list)):
66
+ content = str(content)
67
+
68
+ tool_result = {"type": "tool_result", "tool_use_id": tool_call_id, "content": content}
69
+
70
+ # Anthropic requires tool results to be in a user message
71
+ # Check if the last message was a user message, if so append to it
72
+ if anthropic_request["messages"] and anthropic_request["messages"][-1]["role"] == "user":
73
+ anthropic_request["messages"][-1]["content"].append(tool_result)
74
+ else:
75
+ anthropic_request["messages"].append({"role": "user", "content": [tool_result]})
76
+ continue
77
+
61
78
  anthropic_message = {"role": message.get("role"), "content": []}
62
79
 
63
80
  content = message.get("content", "")
@@ -106,7 +123,18 @@ def install_anthropic(ctx):
106
123
  if "stream" in chat:
107
124
  anthropic_request["stream"] = chat["stream"]
108
125
  if "tools" in chat:
109
- anthropic_request["tools"] = chat["tools"]
126
+ anthropic_tools = []
127
+ for tool in chat["tools"]:
128
+ if tool.get("type") == "function":
129
+ function = tool.get("function", {})
130
+ anthropic_tool = {
131
+ "name": function.get("name"),
132
+ "description": function.get("description"),
133
+ "input_schema": function.get("parameters"),
134
+ }
135
+ anthropic_tools.append(anthropic_tool)
136
+ if anthropic_tools:
137
+ anthropic_request["tools"] = anthropic_tools
110
138
  if "tool_choice" in chat:
111
139
  anthropic_request["tool_choice"] = chat["tool_choice"]
112
140
 
@@ -138,6 +166,7 @@ def install_anthropic(ctx):
138
166
  # Transform content blocks to message content
139
167
  content_parts = []
140
168
  thinking_parts = []
169
+ tool_calls = []
141
170
 
142
171
  for block in response.get("content", []):
143
172
  if block.get("type") == "text":
@@ -145,6 +174,16 @@ def install_anthropic(ctx):
145
174
  elif block.get("type") == "thinking":
146
175
  # Store thinking blocks separately (some models include reasoning)
147
176
  thinking_parts.append(block.get("thinking", ""))
177
+ elif block.get("type") == "tool_use":
178
+ tool_call = {
179
+ "id": block.get("id"),
180
+ "type": "function",
181
+ "function": {
182
+ "name": block.get("name"),
183
+ "arguments": json.dumps(block.get("input", {})),
184
+ },
185
+ }
186
+ tool_calls.append(tool_call)
148
187
 
149
188
  # Combine all text content
150
189
  message_content = "\n".join(content_parts) if content_parts else ""
@@ -160,6 +199,10 @@ def install_anthropic(ctx):
160
199
  if thinking_parts:
161
200
  choice["message"]["thinking"] = "\n".join(thinking_parts)
162
201
 
202
+ # Add tool_calls if present
203
+ if tool_calls:
204
+ choice["message"]["tool_calls"] = tool_calls
205
+
163
206
  ret["choices"].append(choice)
164
207
 
165
208
  # Transform usage
@@ -278,7 +278,8 @@ export default {
278
278
  },
279
279
 
280
280
  async load(ctx) {
281
- const prompts = await ext.getJson(`/prompts.json`)
281
+ const api = await ext.getJson(`/prompts.json`)
282
+ const prompts = api.response || []
282
283
  ctx.setState({ prompts })
283
284
  }
284
285
  }
@@ -0,0 +1,5 @@
1
+ from aiohttp import web
2
+
3
+
4
+ def install(ctx):
5
+ ctx.add_get("/", lambda r: web.json_response(ctx.app.tool_definitions))
@@ -11,7 +11,7 @@ const Tools = {
11
11
  </div>
12
12
 
13
13
  <div class="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4">
14
- <div v-for="tool in ($state.tools || [])" :key="tool.function.name"
14
+ <div v-for="tool in (Array.isArray($state.tools) ? $state.tools : []).filter(x => x.function)" :key="tool.function.name"
15
15
  class="bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden flex flex-col">
16
16
 
17
17
  <div class="p-4 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50">
@@ -100,7 +100,7 @@ const ToolSelector = {
100
100
  setup() {
101
101
  const ctx = inject('ctx')
102
102
 
103
- const availableTools = computed(() => ctx.state.tools || [])
103
+ const availableTools = computed(() => (Array.isArray(ctx.state.tools) ? ctx.state.tools : []).filter(x => x.function))
104
104
 
105
105
  function isToolActive(name) {
106
106
  const only = ctx.prefs.onlyTools
@@ -145,12 +145,12 @@ export default {
145
145
  ToolSelector,
146
146
  })
147
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>`
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
149
 
150
150
  ctx.setLeftIcons({
151
151
  tools: {
152
152
  component: {
153
- template: svg('@click=$ctx.togglePath("/tools")'),
153
+ template: svg(`@click="$ctx.togglePath('/tools')"`),
154
154
  },
155
155
  isActive({ path }) {
156
156
  return path === '/tools'
@@ -162,7 +162,7 @@ export default {
162
162
  tools: {
163
163
  component: {
164
164
  template: svg([
165
- `@click=$ctx.toggleTop("ToolSelector")`,
165
+ `@click="$ctx.toggleTop('ToolSelector')"`,
166
166
  `:class="$prefs.onlyTools == null ? 'text-green-600 dark:text-green-300' : $prefs.onlyTools.length ? 'text-blue-600! dark:text-blue-300!' : ''"`
167
167
  ].join(' ')),
168
168
  // , "{{$prefs.onlyTools == null ? 'Include All Tools' : $prefs.onlyTools.length ? 'Include Selected Tools' : 'All Tools Excluded'}}"
@@ -185,12 +185,12 @@ export default {
185
185
  const prefs = ctx.prefs
186
186
  if (prefs.onlyTools != null) {
187
187
  if (Array.isArray(prefs.onlyTools)) {
188
- request.metadata.only_tools = prefs.onlyTools.length > 0
188
+ request.metadata.tools = prefs.onlyTools.length > 0
189
189
  ? prefs.onlyTools.join(',')
190
190
  : 'none'
191
191
  }
192
192
  } else {
193
- request.metadata.only_tools = 'all'
193
+ request.metadata.tools = 'all'
194
194
  }
195
195
  })
196
196
 
@@ -199,6 +199,6 @@ export default {
199
199
 
200
200
  async load(ctx) {
201
201
  const ext = ctx.scope('tools')
202
- ctx.state.tools = await ext.getJson('/')
202
+ ctx.state.tools = (await ext.getJson('/')).response || []
203
203
  }
204
204
  }
llms/index.html CHANGED
@@ -23,48 +23,36 @@
23
23
  cursor: pointer;
24
24
  }
25
25
  </style>
26
+ <script type="importmap"></script>
27
+
26
28
  </head>
27
- <script type="importmap">
28
- {
29
- "imports": {
30
- "vue": "/ui/lib/vue.min.mjs",
31
- "vue-router": "/ui/lib/vue-router.min.mjs",
32
- "@servicestack/client": "/ui/lib/servicestack-client.mjs",
33
- "@servicestack/vue": "/ui/lib/servicestack-vue.mjs",
34
- "idb": "/ui/lib/idb.min.mjs",
35
- "marked": "/ui/lib/marked.min.mjs",
36
- "highlight.js": "/ui/lib/highlight.min.mjs",
37
- "chart.js": "/ui/lib/chart.js",
38
- "color.js": "/ui/lib/color.js",
39
- "ctx.mjs": "/ui/ctx.mjs"
40
- }
41
- }
42
- </script>
43
29
 
44
30
  <body>
45
31
  <div id="app"></div>
46
- </body>
47
- <script>
48
- let colorScheme = location.search === "?dark"
49
- ? "dark"
50
- : location.search === "?light"
51
- ? "light"
52
- : localStorage.getItem('color-scheme')
53
- let darkMode = colorScheme != null
54
- ? colorScheme === 'dark'
55
- : window.matchMedia('(prefers-color-scheme: dark)').matches
56
- let html = document.documentElement
57
- html.classList.toggle('dark', darkMode)
58
- html.style.setProperty('color-scheme', darkMode ? 'dark' : null)
59
- if (localStorage.getItem('color-scheme') === null) {
60
- localStorage.setItem('color-scheme', darkMode ? 'dark' : 'light')
61
- }
62
- </script>
63
- <script type="module">
64
- import { createContext } from '/ui/index.mjs'
65
32
 
66
- const context = await createContext()
67
- context.app.mount('#app')
68
- </script>
33
+ <script>
34
+ let colorScheme = location.search === "?dark"
35
+ ? "dark"
36
+ : location.search === "?light"
37
+ ? "light"
38
+ : localStorage.getItem('color-scheme')
39
+ let darkMode = colorScheme != null
40
+ ? colorScheme === 'dark'
41
+ : window.matchMedia('(prefers-color-scheme: dark)').matches
42
+ let html = document.documentElement
43
+ html.classList.toggle('dark', darkMode)
44
+ html.style.setProperty('color-scheme', darkMode ? 'dark' : null)
45
+ if (localStorage.getItem('color-scheme') === null) {
46
+ localStorage.setItem('color-scheme', darkMode ? 'dark' : 'light')
47
+ }
48
+ </script>
49
+ <script type="module">
50
+ import { createContext } from '/ui/index.mjs'
51
+
52
+ const context = await createContext()
53
+ context.app.mount('#app')
54
+ </script>
55
+
56
+ </body>
69
57
 
70
58
  </html>
llms/llms.json CHANGED
@@ -9,7 +9,10 @@
9
9
  "restrict_to": "GITHUB_USERS"
10
10
  }
11
11
  },
12
- "disable_extensions": [],
12
+ "disable_extensions": [
13
+ "xmas",
14
+ "duckduckgo"
15
+ ],
13
16
  "defaults": {
14
17
  "headers": {
15
18
  "Content-Type": "application/json",