llms-py 3.0.2__py3-none-any.whl → 3.0.4__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.
@@ -1,5 +1,5 @@
1
1
 
2
- import { ref, watch, nextTick, inject } from 'vue'
2
+ import { ref, watch, computed, nextTick, inject } from 'vue'
3
3
  import { $$, createElement, lastRightPart, ApiResult, createErrorStatus, pick } from "@servicestack/client"
4
4
  import SettingsDialog, { useSettings } from './SettingsDialog.mjs'
5
5
  import ChatBody from './ChatBody.mjs'
@@ -782,18 +782,79 @@ const HomeTools = {
782
782
  `,
783
783
  }
784
784
 
785
+ const ThreadHeader = {
786
+ template: `
787
+ <div v-if="showComponents.length" class="flex items-center justify-center gap-2">
788
+ <div v-for="component in showComponents">
789
+ <component :is="component" :thread="thread" />
790
+ </div>
791
+ </div>
792
+ `,
793
+ props: { thread: Object },
794
+ setup(props) {
795
+ const ctx = inject('ctx')
796
+ const showComponents = computed(() => {
797
+ const args = { thread: props.thread }
798
+ return Object.values(ctx.threadHeaderComponents).filter(def => def.show(args)).map(def => def.component)
799
+ })
800
+ return {
801
+ showComponents,
802
+ }
803
+ }
804
+ }
805
+
785
806
  const ThreadFooter = {
786
807
  template: `
787
- <div>
788
- <div v-for="(componentDef,id) in $ctx.threadFooterComponents">
789
- <component v-if="componentDef.show(thread)" :is="componentDef.component" :thread="thread" />
808
+ <div v-if="showComponents.length">
809
+ <div v-for="component in showComponents">
810
+ <component :is="component" :thread="thread" />
790
811
  </div>
791
812
  </div>
792
813
  `,
793
- props: {
794
- thread: Object,
795
- },
814
+ props: { thread: Object },
815
+ setup(props) {
816
+ const ctx = inject('ctx')
817
+ const showComponents = computed(() => {
818
+ const args = { thread: props.thread }
819
+ return Object.values(ctx.threadFooterComponents).filter(def => def.show(args)).map(def => def.component)
820
+ })
821
+ return {
822
+ showComponents,
823
+ }
824
+ }
825
+ }
826
+
827
+ const ThreadModel = {
828
+ template: `
829
+ <span @click="$chat.setSelectedModel({ name: thread.model})"
830
+ class="flex items-center cursor-pointer px-1.5 py-0.5 text-xs rounded text-gray-600 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 hover:text-gray-900 dark:hover:text-gray-100 transition-colors border hover:border-gray-300 dark:hover:border-gray-700">
831
+ <ProviderIcon class="size-4 mr-1" :provider="$chat.getProviderForModel(thread.model)" />
832
+ {{thread.model}}
833
+ </span>
834
+ `,
835
+ props: { thread: Object },
836
+ }
837
+
838
+ const ThreadTools = {
839
+ template: `
840
+ <div class="text-sm flex items-center gap-1 flex items-center px-1.5 py-0.5 text-xs rounded text-gray-600 dark:text-gray-300 border cursor-help" :title="title">
841
+ <svg class="size-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 10h3V7L6.5 3.5a6 6 0 0 1 8 8l6 6a2 2 0 0 1-3 3l-6-6a6 6 0 0 1-8-8z"/></svg>
842
+ <span v-if="toolFns.length==1">{{toolFns[0].function.name}}</span>
843
+ <span v-else-if="toolFns.length>1">{{toolFns.length}} Tools</span>
844
+ </div>
845
+ `,
846
+ props: { thread: Object },
796
847
  setup(props) {
848
+ const toolFns = computed(() => props.thread.tools.filter(x => x.type === 'function'))
849
+ const title = computed(() => toolFns.value.length == 1
850
+ ? toolFns.value[0].function.name
851
+ : toolFns.value.length > 1
852
+ ? toolFns.value.map(x => x.function.name).join('\n')
853
+ : '')
854
+ return {
855
+ toolFns,
856
+ title,
857
+ }
797
858
  }
798
859
  }
799
860
 
@@ -807,6 +868,7 @@ export default {
807
868
  ChatBody,
808
869
  HomeTools,
809
870
  Home,
871
+ ThreadHeader,
810
872
  ThreadFooter,
811
873
  })
812
874
  ctx.setGlobals({
@@ -835,6 +897,17 @@ export default {
835
897
  { path: '/c/:id', component: ChatBody, meta },
836
898
  ])
837
899
 
900
+ ctx.setThreadHeaders({
901
+ model: {
902
+ component: ThreadModel,
903
+ show({ thread }) { return thread.model }
904
+ },
905
+ tools: {
906
+ component: ThreadTools,
907
+ show({ thread }) { return (thread.tools || []).filter(x => x.type === 'function').length }
908
+ }
909
+ })
910
+
838
911
  const prefs = ctx.getPrefs()
839
912
  if (prefs.model) {
840
913
  ctx.state.selectedModel = prefs.model
@@ -2,7 +2,7 @@
2
2
  @import "tailwindcss";
3
3
  @source "./lib/servicestack-vue.mjs";
4
4
  @source "../../extensions";
5
- @source "../../llms-home/extensions";
5
+ @source "../../llms-home/extensions/";
6
6
 
7
7
  @custom-variant dark (&:where(.dark, .dark *));
8
8
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: llms-py
3
- Version: 3.0.2
3
+ Version: 3.0.4
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
@@ -1,21 +1,23 @@
1
1
  llms/__init__.py,sha256=DKwTZDsyYL_wHe7yvLw49Nf8PSgPSyWaeVdotUqSvrQ,84
2
2
  llms/__main__.py,sha256=hrBulHIt3lmPm1BCyAEVtB6DQ0Hvc3gnIddhHCmJasg,151
3
- llms/db.py,sha256=UGbdnzYLId6qtAOeUAYSJCmkiJuZfqcGRaLyZSRs8tA,11465
3
+ llms/db.py,sha256=BEwBSh7AOc6seylB6Q5k1ru07Zx8WDkSHkto0YWNDSg,11687
4
4
  llms/index.html,sha256=nGk1Djtn9p7l6LuKp4Kg0JIB9fCzxtTWXFfmDb4ggpc,1658
5
5
  llms/llms.json,sha256=gebw9PNWf5UTpU7RDIwo6QcBaJEkU0z3k9EeXR4hQiI,11147
6
- llms/main.py,sha256=otLS2Wq-3UTW_jbyY2FyWEaO6e07Rx3MoowagH5Amws,156220
6
+ llms/main.py,sha256=5VkdSWkz1kCqR5miHoCufYiNFgMi2maXiXdqRGa6Hao,156278
7
7
  llms/providers-extra.json,sha256=w7_5gB0YUPK0PJNeViM7vRDfNGChXUKMHfGHenVxEkM,10165
8
8
  llms/providers.json,sha256=Hc1STJW9hqM_MWBjeJljs_0I3bTo6qhGlEsL0o-dUuA,285221
9
9
  llms/extensions/analytics/ui/index.mjs,sha256=cr9dPmEJjha2xX6A_7xbJxkOolWFP1p6TgIoO8M8juI,69540
10
10
  llms/extensions/app/README.md,sha256=TKoblZpHlheLCh_dfXOxqTc5OvxlgMBa-vKo8Hqb2gg,1370
11
- llms/extensions/app/__init__.py,sha256=yQ-yw_g0ierrOkCiPCvQn4dYrrMXOydHcK2xoUmJbT0,20795
11
+ llms/extensions/app/__init__.py,sha256=eOdIGG7jrQhBZ-ndNlvbTFOhZlH9n1tG-WvqJw8cakA,20812
12
12
  llms/extensions/app/db.py,sha256=CqpHReXXjrLXXNxINo-wsnBJenKZVVHKlWlhtXFWj08,21503
13
13
  llms/extensions/app/ui/Recents.mjs,sha256=HT9R2IEus3dGEqtKPGrgX1eMp4EQ2j2jLwv-Fn1Us5E,9253
14
14
  llms/extensions/app/ui/index.mjs,sha256=sB9176LLNuKFsZ28yL-tROA6J4xePNtvxtSrzFcinRo,13271
15
- llms/extensions/app/ui/threadStore.mjs,sha256=Lf2wR5DYAMLzJFu35lRnc1W28w7_0bUkMpM509xdEBY,12092
15
+ llms/extensions/app/ui/threadStore.mjs,sha256=5qZv3maUfpLXnoEQN6EPYXUbe3B_OCgT_ttoBpvA4Dk,12192
16
16
  llms/extensions/core_tools/CALCULATOR.md,sha256=pJRtCVF01BgxFrSNh2Ys_lrRi3SFwLgJzAX93AGh93Q,1944
17
- llms/extensions/core_tools/__init__.py,sha256=nYeQH20Iy_Yl9S8qGcgLmU7x4e2C43BsiOMG8XYfPM4,23086
17
+ llms/extensions/core_tools/__init__.py,sha256=SkBBjNYM0Vxq2ftAW_0HaA1brl-VrI3rYUcjvtpEBQ4,23078
18
18
  llms/extensions/core_tools/ui/index.mjs,sha256=KycJ2FcQ6BieBY7fjWGxVBGHN6WuFx712OFrO6flXww,31770
19
+ llms/extensions/core_tools/ui/codemirror/codemirror.css,sha256=60lOqXLSZh74b39qxlbdZ4bXIeScnBtG4euWfktvm_M,8720
20
+ llms/extensions/core_tools/ui/codemirror/codemirror.js,sha256=7cA89SlK249o7tVfiEWIiqDEA6ZEWxX4CoZmofVA14s,402008
19
21
  llms/extensions/core_tools/ui/codemirror/addon/edit/closebrackets.js,sha256=FDwwFMKSVPNTHMML5tkCBQhLz8Ns_6b5sqRv1CpAviA,7123
20
22
  llms/extensions/core_tools/ui/codemirror/addon/edit/closetag.js,sha256=b74rk8wXRNnhStHWE0SffhbfTCqihC9ljvwXq_Zi-FA,8544
21
23
  llms/extensions/core_tools/ui/codemirror/addon/edit/continuelist.js,sha256=a6nNlSi3Tn929LnOntBne_7XBX0areAFAYU2jP0OouM,3989
@@ -140,13 +142,13 @@ llms/extensions/system_prompts/ui/prompts.json,sha256=t5DD3bird-87wFa4OlW-bC2wdo
140
142
  llms/extensions/tools/__init__.py,sha256=yfIK7dVqYiZGX5VeJ3x7HQWLPQfuPqeNYJsd0lpZUM4,120
141
143
  llms/extensions/tools/ui/index.mjs,sha256=Nu69U6odCUh8uu1i8d5f8ryO4Lj_OFbPX2LnVyYu1fk,9602
142
144
  llms/ui/App.mjs,sha256=zU-GtbcSMREizjUS9nWiMK6m_oT14MNJ-p_RCz2RVqA,7445
143
- llms/ui/ai.mjs,sha256=F5JXpruePVvlBFiLoGW1x87fC5yL1pMMWtwnfs9QTxk,6540
144
- llms/ui/app.css,sha256=_sRdNrUkYtfjt5nBDsCA5oTT0XjdcadF3RUqjQHVAME,175928
145
- llms/ui/ctx.mjs,sha256=pd_VAnJ6DEmocuMKvIbzw3UdsLBA54AW43_OM1njS8c,11922
145
+ llms/ui/ai.mjs,sha256=5r1oVt7HA8b_ikDpHhA7e6sE8eFaDyxYg3c_Okt4WJw,6540
146
+ llms/ui/app.css,sha256=6iQiPeFZ_7pcf6RB1b7tvh6EY22A9lCn9SCCmoJKP2I,176402
147
+ llms/ui/ctx.mjs,sha256=eFTkWzVBKRU5YDFFVUq3ZDd6eMPa4VRQpE3q0O5Sfgg,12337
146
148
  llms/ui/fav.svg,sha256=_R6MFeXl6wBFT0lqcUxYQIDWgm246YH_3hSTW0oO8qw,734
147
149
  llms/ui/index.mjs,sha256=o-J2GVYYGFtfV4Pzlj-kjK4UrVP6ovTre5jD44gAiIc,4316
148
150
  llms/ui/markdown.mjs,sha256=ZeGXxX4_UEUCVkLZzmwXlqWBfReSFzBivdxNu8uSgFk,6648
149
- llms/ui/tailwind.input.css,sha256=fJInSAoAoF-fhLiWFlocuP5i3b4eWp8grIfG6LyvtVw,15785
151
+ llms/ui/tailwind.input.css,sha256=ZneSjo_uNcvqMT8cAU837yUZoLZ_sWfgr5Gto7TNJPc,15786
150
152
  llms/ui/typography.css,sha256=6o7pbMIamRVlm2GfzSStpcOG4T5eFCK_WcQ3RIHKAsU,19587
151
153
  llms/ui/utils.mjs,sha256=Vv2YsKaOJCNYrxv19q-gU1wSuuMhEcTcm6M7_g9Ff0Y,6664
152
154
  llms/ui/lib/chart.js,sha256=dx8FdDX0Rv6OZtZjr9FQh5h-twFsKjfnb-FvFlQ--cU,196176
@@ -163,12 +165,12 @@ llms/ui/lib/vue.mjs,sha256=75FuLhUTPk19sncwNIrm0BGEL0_Qw298-_v01fPWYoI,542872
163
165
  llms/ui/modules/icons.mjs,sha256=LGcH0ys0QLS2ZKCO42qHpwPYbBV_EssoWLezU4XZEzU,27751
164
166
  llms/ui/modules/layout.mjs,sha256=8pAxs8bedQI3b3eRA9nrfpLZznLmrpp4BZvigYAQjpQ,12572
165
167
  llms/ui/modules/model-selector.mjs,sha256=6U4rAZ7vmQELFRQGWk4YEtq02v3lyHdMq6yUOp-ArXg,43184
166
- llms/ui/modules/chat/ChatBody.mjs,sha256=DCEjXpXJBW3tg2IZr39-ab1NGoy2WDsqGJa5gCAQ4x4,42441
168
+ llms/ui/modules/chat/ChatBody.mjs,sha256=YbpIEl6OeBi1RqCPkW5UFbUk6qNi5B_GfRUK5Pmfms8,42875
167
169
  llms/ui/modules/chat/SettingsDialog.mjs,sha256=HMBJTwrapKrRIAstIIqp0QlJL5O-ho4hzgvfagPfsX8,19930
168
- llms/ui/modules/chat/index.mjs,sha256=d_BSYXQvlNRK3A0L1GOigFxl66FXlTw9TTQAJx34JAU,34062
169
- llms_py-3.0.2.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
170
- llms_py-3.0.2.dist-info/METADATA,sha256=hbUYmI79etmIMdHIrxeingjIjTiG3y_O9AV5KsBfBe4,2191
171
- llms_py-3.0.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
172
- llms_py-3.0.2.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
173
- llms_py-3.0.2.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
174
- llms_py-3.0.2.dist-info/RECORD,,
170
+ llms/ui/modules/chat/index.mjs,sha256=NA_9R7JEqHKZRnYGqte_J7qoDbG3RY8969TTNXqZa1k,37011
171
+ llms_py-3.0.4.dist-info/licenses/LICENSE,sha256=bus9cuAOWeYqBk2OuhSABVV1P4z7hgrEFISpyda_H5w,1532
172
+ llms_py-3.0.4.dist-info/METADATA,sha256=TgxpOLuMVr2KoZytO8HUSZh97FzFD37-V026tC246Mo,2191
173
+ llms_py-3.0.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
174
+ llms_py-3.0.4.dist-info/entry_points.txt,sha256=WswyE7PfnkZMIxboC-MS6flBD6wm-CYU7JSUnMhqMfM,40
175
+ llms_py-3.0.4.dist-info/top_level.txt,sha256=gC7hk9BKSeog8gyg-EM_g2gxm1mKHwFRfK-10BxOsa4,5
176
+ llms_py-3.0.4.dist-info/RECORD,,