open-webui/src/lib/components/chat/MessageInput/Commands.svelte

141 lines
2.9 KiB
Svelte
Raw Normal View History

2024-08-23 12:31:39 +00:00
<script>
import { createEventDispatcher } from 'svelte';
import { toast } from 'svelte-sonner';
const dispatch = createEventDispatcher();
import Prompts from './Commands/Prompts.svelte';
2024-10-02 00:35:35 +00:00
import Projects from './Commands/Projects.svelte';
2024-08-23 12:31:39 +00:00
import Models from './Commands/Models.svelte';
import { removeLastWordFromString } from '$lib/utils';
2024-09-28 00:23:09 +00:00
import { processWeb, processYoutubeVideo } from '$lib/apis/retrieval';
2024-08-23 12:31:39 +00:00
export let prompt = '';
export let files = [];
let commandElement = null;
export const selectUp = () => {
commandElement?.selectUp();
};
export const selectDown = () => {
commandElement?.selectDown();
};
let command = '';
$: command = (prompt?.trim() ?? '').split(' ')?.at(-1) ?? '';
const uploadWeb = async (url) => {
console.log(url);
2024-09-29 16:55:26 +00:00
const fileItem = {
2024-08-23 12:31:39 +00:00
type: 'doc',
name: url,
collection_name: '',
status: false,
url: url,
error: ''
};
try {
2024-09-29 16:55:26 +00:00
files = [...files, fileItem];
2024-09-28 00:23:09 +00:00
const res = await processWeb(localStorage.token, '', url);
2024-08-23 12:31:39 +00:00
if (res) {
2024-09-29 16:55:26 +00:00
fileItem.status = 'processed';
fileItem.collection_name = res.collection_name;
2024-09-29 21:08:55 +00:00
fileItem.file = {
content: res.content,
...fileItem.file
};
2024-09-29 16:55:26 +00:00
2024-08-23 12:31:39 +00:00
files = files;
}
} catch (e) {
// Remove the failed doc from the files array
files = files.filter((f) => f.name !== url);
2024-09-29 21:08:55 +00:00
toast.error(JSON.stringify(e));
2024-08-23 12:31:39 +00:00
}
};
const uploadYoutubeTranscription = async (url) => {
console.log(url);
2024-09-29 16:55:26 +00:00
const fileItem = {
2024-08-23 12:31:39 +00:00
type: 'doc',
name: url,
collection_name: '',
status: false,
url: url,
error: ''
};
try {
2024-09-29 16:55:26 +00:00
files = [...files, fileItem];
2024-09-28 00:23:09 +00:00
const res = await processYoutubeVideo(localStorage.token, url);
2024-08-23 12:31:39 +00:00
if (res) {
2024-09-29 16:55:26 +00:00
fileItem.status = 'processed';
fileItem.collection_name = res.collection_name;
2024-09-29 21:08:55 +00:00
fileItem.file = {
content: res.content,
...fileItem.file
};
2024-08-23 12:31:39 +00:00
files = files;
}
} catch (e) {
// Remove the failed doc from the files array
files = files.filter((f) => f.name !== url);
toast.error(e);
}
};
</script>
{#if ['/', '#', '@'].includes(command?.charAt(0))}
{#if command?.charAt(0) === '/'}
<Prompts bind:this={commandElement} bind:prompt bind:files {command} />
{:else if command?.charAt(0) === '#'}
2024-10-02 00:35:35 +00:00
<Projects
2024-08-23 12:31:39 +00:00
bind:this={commandElement}
bind:prompt
{command}
on:youtube={(e) => {
console.log(e);
uploadYoutubeTranscription(e.detail);
}}
on:url={(e) => {
console.log(e);
uploadWeb(e.detail);
}}
on:select={(e) => {
console.log(e);
files = [
...files,
{
type: e?.detail?.type ?? 'file',
...e.detail,
status: 'processed'
}
];
dispatch('select');
}}
/>
{:else if command?.charAt(0) === '@'}
<Models
bind:this={commandElement}
{command}
on:select={(e) => {
prompt = removeLastWordFromString(prompt, command);
dispatch('select', {
type: 'model',
data: e.detail
});
}}
/>
{/if}
{/if}