llms-py 2.0.12__py3-none-any.whl → 2.0.14__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 (41) hide show
  1. llms.py +68 -37
  2. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/ai.mjs +1 -1
  3. {llms_py-2.0.12.dist-info → llms_py-2.0.14.dist-info}/METADATA +1 -1
  4. llms_py-2.0.14.dist-info/RECORD +40 -0
  5. llms_py-2.0.12.dist-info/RECORD +0 -40
  6. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/index.html +0 -0
  7. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/llms.json +0 -0
  8. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/requirements.txt +0 -0
  9. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/App.mjs +0 -0
  10. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Avatar.mjs +0 -0
  11. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Brand.mjs +0 -0
  12. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/ChatPrompt.mjs +0 -0
  13. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Main.mjs +0 -0
  14. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/ModelSelector.mjs +0 -0
  15. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/ProviderStatus.mjs +0 -0
  16. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Recents.mjs +0 -0
  17. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/SettingsDialog.mjs +0 -0
  18. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Sidebar.mjs +0 -0
  19. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/SignIn.mjs +0 -0
  20. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/SystemPromptEditor.mjs +0 -0
  21. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/SystemPromptSelector.mjs +0 -0
  22. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/Welcome.mjs +0 -0
  23. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/app.css +0 -0
  24. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/fav.svg +0 -0
  25. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/highlight.min.mjs +0 -0
  26. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/idb.min.mjs +0 -0
  27. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/marked.min.mjs +0 -0
  28. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/servicestack-client.mjs +0 -0
  29. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/servicestack-vue.mjs +0 -0
  30. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/vue-router.min.mjs +0 -0
  31. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/lib/vue.min.mjs +0 -0
  32. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/markdown.mjs +0 -0
  33. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/tailwind.input.css +0 -0
  34. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/threadStore.mjs +0 -0
  35. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/typography.css +0 -0
  36. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui/utils.mjs +0 -0
  37. {llms_py-2.0.12.data → llms_py-2.0.14.data}/data/ui.json +0 -0
  38. {llms_py-2.0.12.dist-info → llms_py-2.0.14.dist-info}/WHEEL +0 -0
  39. {llms_py-2.0.12.dist-info → llms_py-2.0.14.dist-info}/entry_points.txt +0 -0
  40. {llms_py-2.0.12.dist-info → llms_py-2.0.14.dist-info}/licenses/LICENSE +0 -0
  41. {llms_py-2.0.12.dist-info → llms_py-2.0.14.dist-info}/top_level.txt +0 -0
llms.py CHANGED
@@ -22,7 +22,7 @@ from aiohttp import web
22
22
  from pathlib import Path
23
23
  from importlib import resources # Py≥3.9 (pip install importlib_resources for 3.7/3.8)
24
24
 
25
- VERSION = "2.0.12"
25
+ VERSION = "2.0.14"
26
26
  _ROOT = None
27
27
  g_config_path = None
28
28
  g_ui_path = None
@@ -838,6 +838,7 @@ def github_url(filename):
838
838
 
839
839
  async def save_text(url, save_path):
840
840
  async with aiohttp.ClientSession() as session:
841
+ _log(f"GET {url}")
841
842
  async with session.get(url) as resp:
842
843
  text = await resp.text()
843
844
  if resp.status >= 400:
@@ -1110,34 +1111,61 @@ def main():
1110
1111
  if not g_config_path or not os.path.exists(g_config_path):
1111
1112
  # copy llms.json and ui.json to llms_home
1112
1113
 
1113
- if not os.path.exists(home_config_path) and resource_exists(resource_config_path):
1114
+ if not os.path.exists(home_config_path):
1114
1115
  llms_home = os.path.dirname(home_config_path)
1115
1116
  os.makedirs(llms_home, exist_ok=True)
1116
1117
 
1117
- # Read config from resource (handle both Path and Traversable objects)
1118
- try:
1119
- config_json = read_resource_text(resource_config_path)
1120
- with open(home_config_path, "w") as f:
1121
- f.write(config_json)
1122
- _log(f"Created default config at {home_config_path}")
1123
- except (OSError, AttributeError) as e:
1124
- _log(f"Error reading resource config: {e}")
1125
-
1126
- # Read UI config from resource
1127
- if not os.path.exists(home_ui_path) and resource_exists(resource_ui_path):
1118
+ if resource_exists(resource_config_path):
1128
1119
  try:
1129
- ui_json = read_resource_text(resource_ui_path)
1130
- with open(home_ui_path, "w") as f:
1131
- f.write(ui_json)
1132
- _log(f"Created default ui config at {home_ui_path}")
1120
+ # Read config from resource (handle both Path and Traversable objects)
1121
+ config_json = read_resource_text(resource_ui_path)
1133
1122
  except (OSError, AttributeError) as e:
1134
- _log(f"Error reading resource ui config: {e}")
1123
+ _log(f"Error reading resource config: {e}")
1124
+ if not config_json:
1125
+ try:
1126
+ config_json = asyncio.run(save_text(github_url("llms.json"), home_ui_path))
1127
+ except Exception as e:
1128
+ _log(f"Error downloading llms.json: {e}")
1129
+ print("Could not create llms.json. Create one with --init or use --config <path>")
1130
+ exit(1)
1135
1131
 
1132
+ with open(home_config_path, "w") as f:
1133
+ f.write(config_json)
1134
+ _log(f"Created default config at {home_config_path}")
1136
1135
  # Update g_config_path to point to the copied file
1137
1136
  g_config_path = home_config_path
1138
- else:
1139
- print("Config file not found. Create one with --init or use --config <path>")
1140
- exit(1)
1137
+ if not g_config_path or not os.path.exists(g_config_path):
1138
+ print("llms.json not found. Create one with --init or use --config <path>")
1139
+ exit(1)
1140
+
1141
+ if not g_ui_path or not os.path.exists(g_ui_path):
1142
+ # Read UI config from resource
1143
+ if not os.path.exists(home_ui_path):
1144
+ llms_home = os.path.dirname(home_ui_path)
1145
+ os.makedirs(llms_home, exist_ok=True)
1146
+ if resource_exists(resource_ui_path):
1147
+ try:
1148
+ # Read config from resource (handle both Path and Traversable objects)
1149
+ ui_json = read_resource_text(resource_ui_path)
1150
+ except (OSError, AttributeError) as e:
1151
+ _log(f"Error reading resource ui config: {e}")
1152
+ if not ui_json:
1153
+ try:
1154
+ ui_json = asyncio.run(save_text(github_url("ui.json"), home_ui_path))
1155
+ except Exception as e:
1156
+ _log(f"Error downloading ui.json: {e}")
1157
+ print("Could not create ui.json. Create one with --init or use --config <path>")
1158
+ exit(1)
1159
+
1160
+ with open(home_ui_path, "w") as f:
1161
+ f.write(ui_json)
1162
+ _log(f"Created default ui config at {home_ui_path}")
1163
+
1164
+ # Update g_config_path to point to the copied file
1165
+ g_ui_path = home_ui_path
1166
+ if not g_ui_path or not os.path.exists(g_ui_path):
1167
+ print("ui.json not found. Create one with --init or use --config <path>")
1168
+ exit(1)
1141
1169
 
1142
1170
  # read contents
1143
1171
  with open(g_config_path, "r") as f:
@@ -1173,6 +1201,10 @@ def main():
1173
1201
  if cli_args.serve is not None:
1174
1202
  port = int(cli_args.serve)
1175
1203
 
1204
+ if not os.path.exists(g_ui_path):
1205
+ print(f"UI not found at {g_ui_path}")
1206
+ exit(1)
1207
+
1176
1208
  app = web.Application()
1177
1209
 
1178
1210
  async def chat_handler(request):
@@ -1247,6 +1279,20 @@ def main():
1247
1279
  raise web.HTTPNotFound
1248
1280
 
1249
1281
  app.router.add_get("/ui/{path:.*}", ui_static, name="ui_static")
1282
+
1283
+ async def ui_config_handler(request):
1284
+ with open(g_ui_path, "r") as f:
1285
+ ui = json.load(f)
1286
+ if 'defaults' not in ui:
1287
+ ui['defaults'] = g_config['defaults']
1288
+ enabled, disabled = provider_status()
1289
+ ui['status'] = {
1290
+ "all": list(g_config['providers'].keys()),
1291
+ "enabled": enabled,
1292
+ "disabled": disabled
1293
+ }
1294
+ return web.json_response(ui)
1295
+ app.router.add_get('/config', ui_config_handler)
1250
1296
 
1251
1297
  async def not_found_handler(request):
1252
1298
  return web.Response(text="404: Not Found", status=404)
@@ -1262,24 +1308,9 @@ def main():
1262
1308
 
1263
1309
  # Serve index.html as fallback route (SPA routing)
1264
1310
  app.router.add_route('*', '/{tail:.*}', index_handler)
1265
-
1266
- if os.path.exists(g_ui_path):
1267
- async def ui_config_handler(request):
1268
- with open(g_ui_path, "r") as f:
1269
- ui = json.load(f)
1270
- if 'defaults' not in ui:
1271
- ui['defaults'] = g_config['defaults']
1272
- enabled, disabled = provider_status()
1273
- ui['status'] = {
1274
- "all": list(g_config['providers'].keys()),
1275
- "enabled": enabled,
1276
- "disabled": disabled
1277
- }
1278
- return web.json_response(ui)
1279
- app.router.add_get('/config', ui_config_handler)
1280
1311
 
1281
1312
  print(f"Starting server on port {port}...")
1282
- web.run_app(app, host='0.0.0.0', port=port)
1313
+ web.run_app(app, host='0.0.0.0', port=port, print=_log)
1283
1314
  exit(0)
1284
1315
 
1285
1316
  if cli_args.enable is not None:
@@ -6,7 +6,7 @@ const headers = { 'Accept': 'application/json' }
6
6
  const prefsKey = 'llms.prefs'
7
7
 
8
8
  export const o = {
9
- version: '2.0.12',
9
+ version: '2.0.14',
10
10
  base,
11
11
  prefsKey,
12
12
  welcome: 'Welcome to llms.py',
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 2.0.12
3
+ Version: 2.0.14
4
4
  Summary: A lightweight CLI tool and OpenAI-compatible server for querying multiple Large Language Model (LLM) providers
5
5
  Home-page: https://github.com/ServiceStack/llms
6
6
  Author: ServiceStack
@@ -0,0 +1,40 @@
1
+ llms.py,sha256=bh_8AmA4fPNdE_9oOjJrrAnPlKNeoKyDmE9Buq8iV5c,60500
2
+ llms_py-2.0.14.data/data/index.html,sha256=RmvPW7H49tHR3DdQvvSrcR_OeCt1InYd5dirBxfZCpo,2417
3
+ llms_py-2.0.14.data/data/llms.json,sha256=aQFm_lXsPLTWCndE2DNhTY04P576U7NFN9hx5-QwL3E,19582
4
+ llms_py-2.0.14.data/data/requirements.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8
5
+ llms_py-2.0.14.data/data/ui.json,sha256=iBOmpNeD5-o8AgUa51ymS-KemovJ7bm9J1fnL0nf8jk,134025
6
+ llms_py-2.0.14.data/data/ui/App.mjs,sha256=hXtUjaL3GrcIHieEK3BzIG72OVzrorBBS4RkE1DOGc4,439
7
+ llms_py-2.0.14.data/data/ui/Avatar.mjs,sha256=3rHpxe_LuCDiNP895F3FOjWx4j377JA9rD1FLluvtgA,851
8
+ llms_py-2.0.14.data/data/ui/Brand.mjs,sha256=ZkJ1Yd9ZgdTbs7f3ezM0UtsHMcm6v4-L-m3avnSXAXU,1184
9
+ llms_py-2.0.14.data/data/ui/ChatPrompt.mjs,sha256=IbfCx3W0SlX8x9lvaFjB1rqJqNkbeUvfqFHP9iKzZ9s,19776
10
+ llms_py-2.0.14.data/data/ui/Main.mjs,sha256=kLNWyXWUgHAaX3C3kVkAHOLvEI3H4bd5k9yMkUIRQPU,27348
11
+ llms_py-2.0.14.data/data/ui/ModelSelector.mjs,sha256=qiI-7DBwif5ipNZtzgaZQ2o_wHc23dBRMY6zVkMOCak,947
12
+ llms_py-2.0.14.data/data/ui/ProviderStatus.mjs,sha256=qF_rPdhyt9GffKdPCJdU0yanrDJ3cw1HLPygFP_KjEs,5744
13
+ llms_py-2.0.14.data/data/ui/Recents.mjs,sha256=hmj7V-RXVw-DqMXjUr3OhFHTYQTkvkEhuNEDTGBf3Qw,8448
14
+ llms_py-2.0.14.data/data/ui/SettingsDialog.mjs,sha256=Jm21s5CcZT97ZEhPc7c1WgnLOLdfSiC1SDroYsh7zM4,18095
15
+ llms_py-2.0.14.data/data/ui/Sidebar.mjs,sha256=ERm2Q7pftKTHLCjf-Q76joy1dsvtNWLoYH-wO2mS1LI,9781
16
+ llms_py-2.0.14.data/data/ui/SignIn.mjs,sha256=df3b-7L3ZIneDGbJWUk93K9RGo40gVeuR5StzT1ZH9g,2324
17
+ llms_py-2.0.14.data/data/ui/SystemPromptEditor.mjs,sha256=2CyIUvkIubqYPyIp5zC6_I8CMxvYINuYNjDxvMz4VRU,1265
18
+ llms_py-2.0.14.data/data/ui/SystemPromptSelector.mjs,sha256=AuEtRwUf_RkGgene3nVA9bw8AeMb-b5_6ZLJCTWA8KQ,3051
19
+ llms_py-2.0.14.data/data/ui/Welcome.mjs,sha256=QFAxN7sjWlhMvOIJCmHjNFCQcvpM_T-b4ze1ld9Hj7I,912
20
+ llms_py-2.0.14.data/data/ui/ai.mjs,sha256=mQpBHkU8jp0DO0vtdkVujzWJcC04SDpobutk3sWVgto,2346
21
+ llms_py-2.0.14.data/data/ui/app.css,sha256=1Z4coREGsjMw7lYabejdaG0ZMwPpP5lmjRHRDYygq-g,94964
22
+ llms_py-2.0.14.data/data/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
23
+ llms_py-2.0.14.data/data/ui/markdown.mjs,sha256=O5UspOeD8-E23rxOLWcS4eyy2YejMbPwszCYteVtuoU,6221
24
+ llms_py-2.0.14.data/data/ui/tailwind.input.css,sha256=P6QxCwbTBAaG2079ddgtFuuXDLIztEkJDFwj0wmOvkk,11978
25
+ llms_py-2.0.14.data/data/ui/threadStore.mjs,sha256=nM53p1E78Jc7tPOoyS3J3SW9F1njcZ-Fw5FlR9l-3yY,7215
26
+ llms_py-2.0.14.data/data/ui/typography.css,sha256=Z5Fe2IQWnh7bu1CMXniYt0SkaN2fXOFlOuniXUW8oGM,19325
27
+ llms_py-2.0.14.data/data/ui/utils.mjs,sha256=UKyaBsuJYEc-MWoL9b1M5-t3x6h5_HV9HsNBoDVtBRw,4226
28
+ llms_py-2.0.14.data/data/ui/lib/highlight.min.mjs,sha256=sG7wq8bF-IKkfie7S4QSyh5DdHBRf0NqQxMOEH8-MT0,127458
29
+ llms_py-2.0.14.data/data/ui/lib/idb.min.mjs,sha256=CeTXyV4I_pB5vnibvJuyXdMs0iVF2ZL0Z7cdm3w_QaI,3853
30
+ llms_py-2.0.14.data/data/ui/lib/marked.min.mjs,sha256=QRHb_VZugcBJRD2EP6gYlVFEsJw5C2fQ8ImMf_pA2_s,39488
31
+ llms_py-2.0.14.data/data/ui/lib/servicestack-client.mjs,sha256=UVafVbzhJ_0N2lzv7rlzIbzwnWpoqXxGk3N3FSKgOOc,54534
32
+ llms_py-2.0.14.data/data/ui/lib/servicestack-vue.mjs,sha256=r_-khYokisXJAIPDLh8Wq6YtcLAY6HNjtJlCZJjLy74,215181
33
+ llms_py-2.0.14.data/data/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
34
+ llms_py-2.0.14.data/data/ui/lib/vue.min.mjs,sha256=iXh97m5hotl0eFllb3aoasQTImvp7mQoRJ_0HoxmZkw,163811
35
+ llms_py-2.0.14.dist-info/licenses/LICENSE,sha256=rRryrddGfVftpde-rmAZpW0R8IJihqJ8t8wpfDXoKiQ,1549
36
+ llms_py-2.0.14.dist-info/METADATA,sha256=zyBLBoDwdXrK2ZZT14e3kfDyKR0I3kZF6uEq2KZJ5xY,28351
37
+ llms_py-2.0.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
+ llms_py-2.0.14.dist-info/entry_points.txt,sha256=svUoTt28bIJeo6Mb1ffDBLyzhD90DWtFbfp0ShyRCgU,35
39
+ llms_py-2.0.14.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
40
+ llms_py-2.0.14.dist-info/RECORD,,
@@ -1,40 +0,0 @@
1
- llms.py,sha256=P6Lu9lHPujMd4HwXrx4_pJic6ye4cGps0lFf5X-f85c,59146
2
- llms_py-2.0.12.data/data/index.html,sha256=RmvPW7H49tHR3DdQvvSrcR_OeCt1InYd5dirBxfZCpo,2417
3
- llms_py-2.0.12.data/data/llms.json,sha256=aQFm_lXsPLTWCndE2DNhTY04P576U7NFN9hx5-QwL3E,19582
4
- llms_py-2.0.12.data/data/requirements.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8
5
- llms_py-2.0.12.data/data/ui.json,sha256=iBOmpNeD5-o8AgUa51ymS-KemovJ7bm9J1fnL0nf8jk,134025
6
- llms_py-2.0.12.data/data/ui/App.mjs,sha256=hXtUjaL3GrcIHieEK3BzIG72OVzrorBBS4RkE1DOGc4,439
7
- llms_py-2.0.12.data/data/ui/Avatar.mjs,sha256=3rHpxe_LuCDiNP895F3FOjWx4j377JA9rD1FLluvtgA,851
8
- llms_py-2.0.12.data/data/ui/Brand.mjs,sha256=ZkJ1Yd9ZgdTbs7f3ezM0UtsHMcm6v4-L-m3avnSXAXU,1184
9
- llms_py-2.0.12.data/data/ui/ChatPrompt.mjs,sha256=IbfCx3W0SlX8x9lvaFjB1rqJqNkbeUvfqFHP9iKzZ9s,19776
10
- llms_py-2.0.12.data/data/ui/Main.mjs,sha256=kLNWyXWUgHAaX3C3kVkAHOLvEI3H4bd5k9yMkUIRQPU,27348
11
- llms_py-2.0.12.data/data/ui/ModelSelector.mjs,sha256=qiI-7DBwif5ipNZtzgaZQ2o_wHc23dBRMY6zVkMOCak,947
12
- llms_py-2.0.12.data/data/ui/ProviderStatus.mjs,sha256=qF_rPdhyt9GffKdPCJdU0yanrDJ3cw1HLPygFP_KjEs,5744
13
- llms_py-2.0.12.data/data/ui/Recents.mjs,sha256=hmj7V-RXVw-DqMXjUr3OhFHTYQTkvkEhuNEDTGBf3Qw,8448
14
- llms_py-2.0.12.data/data/ui/SettingsDialog.mjs,sha256=Jm21s5CcZT97ZEhPc7c1WgnLOLdfSiC1SDroYsh7zM4,18095
15
- llms_py-2.0.12.data/data/ui/Sidebar.mjs,sha256=ERm2Q7pftKTHLCjf-Q76joy1dsvtNWLoYH-wO2mS1LI,9781
16
- llms_py-2.0.12.data/data/ui/SignIn.mjs,sha256=df3b-7L3ZIneDGbJWUk93K9RGo40gVeuR5StzT1ZH9g,2324
17
- llms_py-2.0.12.data/data/ui/SystemPromptEditor.mjs,sha256=2CyIUvkIubqYPyIp5zC6_I8CMxvYINuYNjDxvMz4VRU,1265
18
- llms_py-2.0.12.data/data/ui/SystemPromptSelector.mjs,sha256=AuEtRwUf_RkGgene3nVA9bw8AeMb-b5_6ZLJCTWA8KQ,3051
19
- llms_py-2.0.12.data/data/ui/Welcome.mjs,sha256=QFAxN7sjWlhMvOIJCmHjNFCQcvpM_T-b4ze1ld9Hj7I,912
20
- llms_py-2.0.12.data/data/ui/ai.mjs,sha256=tGAENGWY3gxn6j0_SqDTX14-rKdAlXsmAMQ9Mz2lUcw,2346
21
- llms_py-2.0.12.data/data/ui/app.css,sha256=1Z4coREGsjMw7lYabejdaG0ZMwPpP5lmjRHRDYygq-g,94964
22
- llms_py-2.0.12.data/data/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
23
- llms_py-2.0.12.data/data/ui/markdown.mjs,sha256=O5UspOeD8-E23rxOLWcS4eyy2YejMbPwszCYteVtuoU,6221
24
- llms_py-2.0.12.data/data/ui/tailwind.input.css,sha256=P6QxCwbTBAaG2079ddgtFuuXDLIztEkJDFwj0wmOvkk,11978
25
- llms_py-2.0.12.data/data/ui/threadStore.mjs,sha256=nM53p1E78Jc7tPOoyS3J3SW9F1njcZ-Fw5FlR9l-3yY,7215
26
- llms_py-2.0.12.data/data/ui/typography.css,sha256=Z5Fe2IQWnh7bu1CMXniYt0SkaN2fXOFlOuniXUW8oGM,19325
27
- llms_py-2.0.12.data/data/ui/utils.mjs,sha256=UKyaBsuJYEc-MWoL9b1M5-t3x6h5_HV9HsNBoDVtBRw,4226
28
- llms_py-2.0.12.data/data/ui/lib/highlight.min.mjs,sha256=sG7wq8bF-IKkfie7S4QSyh5DdHBRf0NqQxMOEH8-MT0,127458
29
- llms_py-2.0.12.data/data/ui/lib/idb.min.mjs,sha256=CeTXyV4I_pB5vnibvJuyXdMs0iVF2ZL0Z7cdm3w_QaI,3853
30
- llms_py-2.0.12.data/data/ui/lib/marked.min.mjs,sha256=QRHb_VZugcBJRD2EP6gYlVFEsJw5C2fQ8ImMf_pA2_s,39488
31
- llms_py-2.0.12.data/data/ui/lib/servicestack-client.mjs,sha256=UVafVbzhJ_0N2lzv7rlzIbzwnWpoqXxGk3N3FSKgOOc,54534
32
- llms_py-2.0.12.data/data/ui/lib/servicestack-vue.mjs,sha256=r_-khYokisXJAIPDLh8Wq6YtcLAY6HNjtJlCZJjLy74,215181
33
- llms_py-2.0.12.data/data/ui/lib/vue-router.min.mjs,sha256=fR30GHoXI1u81zyZ26YEU105pZgbbAKSXbpnzFKIxls,30418
34
- llms_py-2.0.12.data/data/ui/lib/vue.min.mjs,sha256=iXh97m5hotl0eFllb3aoasQTImvp7mQoRJ_0HoxmZkw,163811
35
- llms_py-2.0.12.dist-info/licenses/LICENSE,sha256=rRryrddGfVftpde-rmAZpW0R8IJihqJ8t8wpfDXoKiQ,1549
36
- llms_py-2.0.12.dist-info/METADATA,sha256=S545zYZs-obRPtHMHN8g4mVr2D9DAz21wF6Avo3GDEk,28351
37
- llms_py-2.0.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
38
- llms_py-2.0.12.dist-info/entry_points.txt,sha256=svUoTt28bIJeo6Mb1ffDBLyzhD90DWtFbfp0ShyRCgU,35
39
- llms_py-2.0.12.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
40
- llms_py-2.0.12.dist-info/RECORD,,