diff --git a/package-lock.json b/package-lock.json index e645d79..15510ce 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "eslint-plugin-svelte3": "^4.0.0", "flourite": "^1.2.4", "gpt-tokenizer": "^2.0.0", + "llama-tokenizer-js": "^1.1.1", "postcss": "^8.4.26", "sass": "^1.63.6", "stacking-order": "^2.0.0", @@ -3182,6 +3183,12 @@ "node": ">= 0.8.0" } }, + "node_modules/llama-tokenizer-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/llama-tokenizer-js/-/llama-tokenizer-js-1.1.1.tgz", + "integrity": "sha512-5H2oSJnSufWGhOw6hcCGAqJeB3POmeIBzRklH3cXs0L4MSAYdwoYTodni4j5YVo6jApdhaqaNVU66gNRgXeBRg==", + "dev": true + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", diff --git a/package.json b/package.json index a4dfe5d..ec0de52 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "eslint-plugin-svelte3": "^4.0.0", "flourite": "^1.2.4", "gpt-tokenizer": "^2.0.0", + "llama-tokenizer-js": "^1.1.1", "postcss": "^8.4.26", "sass": "^1.63.6", "stacking-order": "^2.0.0", diff --git a/src/lib/ApiUtil.svelte b/src/lib/ApiUtil.svelte index 77edbc7..afd2f7f 100644 --- a/src/lib/ApiUtil.svelte +++ b/src/lib/ApiUtil.svelte @@ -5,10 +5,12 @@ const endpointGenerations = import.meta.env.VITE_ENDPOINT_GENERATIONS || '/v1/images/generations' const endpointModels = import.meta.env.VITE_ENDPOINT_MODELS || '/v1/models' const endpointEmbeddings = import.meta.env.VITE_ENDPOINT_EMBEDDINGS || '/v1/embeddings' + const endpointPetals = import.meta.env.VITE_PEDALS_WEBSOCKET || 'wss://chat.petals.dev/api/v2/generate' export const getApiBase = ():string => apiBase export const getEndpointCompletions = ():string => endpointCompletions export const getEndpointGenerations = ():string => endpointGenerations export const getEndpointModels = ():string => endpointModels export const getEndpointEmbeddings = ():string => endpointEmbeddings + export const getPetals = ():string => endpointPetals \ No newline at end of file diff --git a/src/lib/Chat.svelte b/src/lib/Chat.svelte index 6826d9c..db0d065 100644 --- a/src/lib/Chat.svelte +++ b/src/lib/Chat.svelte @@ -40,6 +40,7 @@ import { openModal } from 'svelte-modals' import PromptInput from './PromptInput.svelte' import { ChatRequest } from './ChatRequest.svelte' + import { getModelDetail } from './Models.svelte' export let params = { chatId: '' } const chatId: number = parseInt(params.chatId) @@ -245,6 +246,19 @@ chatRequest.updating = true chatRequest.updatingMessage = '' + let doScroll = true + let didScroll = false + + const checkUserScroll = (e: Event) => { + const el = e.target as HTMLElement + if (el && e.isTrusted && didScroll) { + // from user + doScroll = (window.innerHeight + window.scrollY + 10) >= document.body.offsetHeight + } + } + + window.addEventListener('scroll', checkUserScroll) + try { const response = await chatRequest.sendRequest($currentChatMessages, { chat, @@ -252,7 +266,8 @@ streaming: chatSettings.stream, fillMessage, onMessageChange: (messages) => { - scrollToBottom(true) + if (doScroll) scrollToBottom(true) + didScroll = !!messages[0]?.content } }) await response.promiseToFinish() @@ -263,6 +278,8 @@ } catch (e) { console.error(e) } + + window.removeEventListener('scroll', checkUserScroll) chatRequest.updating = false chatRequest.updatingMessage = '' @@ -273,13 +290,16 @@ const suggestName = async (): Promise => { const suggestMessage: Message = { role: 'user', - content: "Using appropriate language, please give a 5 word summary of this conversation's topic.", + content: "Using appropriate language, please tell me a short 6 word summary of this conversation's topic for use as a book title. Only respond with the summary.", uuid: uuidv4() } const suggestMessages = $currentChatMessages.slice(0, 10) // limit to first 10 messages suggestMessages.push(suggestMessage) + chatRequest.updating = true + chatRequest.updatingMessage = 'Getting suggestion for chat name...' + const response = await chatRequest.sendRequest(suggestMessages, { chat, autoAddMessages: false, @@ -297,7 +317,7 @@ }) } else { response.getMessages().forEach(m => { - const name = m.content.split(/\s+/).slice(0, 8).join(' ').trim() + const name = m.content.split(/\s+/).slice(0, 8).join(' ').replace(/^[^a-z0-9!?]+|[^a-z0-9!?]+$/gi, '').trim() if (name) chat.name = name }) saveChatStore() @@ -420,7 +440,7 @@
{#each Object.entries(chat.usage || {}) as [model, usage]}

- {model} total {usage.total_tokens} + {getModelDetail(model || '').label || model} total {usage.total_tokens} tokens ~= ${getPrice(usage, model).toFixed(6)}

{/each} diff --git a/src/lib/ChatCompletionResponse.svelte b/src/lib/ChatCompletionResponse.svelte index 03c1c31..72fd4e0 100644 --- a/src/lib/ChatCompletionResponse.svelte +++ b/src/lib/ChatCompletionResponse.svelte @@ -1,9 +1,9 @@ \ No newline at end of file diff --git a/src/lib/ChatRequestPetals.svelte b/src/lib/ChatRequestPetals.svelte new file mode 100644 index 0000000..f7e7833 --- /dev/null +++ b/src/lib/ChatRequestPetals.svelte @@ -0,0 +1,139 @@ + \ No newline at end of file diff --git a/src/lib/ChatSettingField.svelte b/src/lib/ChatSettingField.svelte index 394108b..0baf968 100644 --- a/src/lib/ChatSettingField.svelte +++ b/src/lib/ChatSettingField.svelte @@ -3,7 +3,7 @@ // import { getProfile } from './Profiles.svelte' import { cleanSettingValue, setChatSettingValue } from './Storage.svelte' import type { Chat, ChatSetting, ChatSettings, ControlAction, FieldControl, SettingPrompt } from './Types.svelte' - import { autoGrowInputOnEvent, errorNotice } from './Util.svelte' + import { autoGrowInputOnEvent, errorNotice, valueOf } from './Util.svelte' // import { replace } from 'svelte-spa-router' import Fa from 'svelte-fa/src/fa.svelte' import { openModal } from 'svelte-modals' @@ -22,6 +22,10 @@ const chatId = chat.id let show = false + + let header = valueOf(chatId, setting.header) + let headerClass = valueOf(chatId, setting.headerClass) + let placeholder = valueOf(chatId, setting.placeholder) const buildFieldControls = () => { fieldControls = (setting.fieldControls || [] as FieldControl[]).map(fc => { @@ -38,6 +42,9 @@ afterUpdate(() => { show = (typeof setting.hide !== 'function') || !setting.hide(chatId) + header = valueOf(chatId, setting.header) + headerClass = valueOf(chatId, setting.headerClass) + placeholder = valueOf(chatId, setting.placeholder) buildFieldControls() }) @@ -146,9 +153,9 @@ {#if show} - {#if setting.header} -

- {@html setting.header} + {#if header} +

+ {@html header}

{/if}
@@ -171,7 +178,7 @@