forked from open-webui/open-webui
		
	feat: enable backend ollama url update
This commit is contained in:
		
							parent
							
								
									bdb3f50771
								
							
						
					
					
						commit
						30aff2db53
					
				
					 13 changed files with 554 additions and 409 deletions
				
			
		|  | @ -14,7 +14,7 @@ | |||
| 	import { getOpenAIModels } from '$lib/apis/openai'; | ||||
| 
 | ||||
| 	import { user, showSettings, settings, models, modelfiles, prompts } from '$lib/stores'; | ||||
| 	import { OLLAMA_API_BASE_URL, REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; | ||||
| 	import { REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants'; | ||||
| 
 | ||||
| 	import SettingsModal from '$lib/components/chat/SettingsModal.svelte'; | ||||
| 	import Sidebar from '$lib/components/layout/Sidebar.svelte'; | ||||
|  | @ -32,10 +32,7 @@ | |||
| 	const getModels = async () => { | ||||
| 		let models = []; | ||||
| 		models.push( | ||||
| 			...(await getOllamaModels( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token | ||||
| 			).catch((error) => { | ||||
| 			...(await getOllamaModels(localStorage.token).catch((error) => { | ||||
| 				toast.error(error); | ||||
| 				return []; | ||||
| 			})) | ||||
|  | @ -58,10 +55,7 @@ | |||
| 
 | ||||
| 	const setOllamaVersion = async (version: string = '') => { | ||||
| 		if (version === '') { | ||||
| 			version = await getOllamaVersion( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token | ||||
| 			).catch((error) => { | ||||
| 			version = await getOllamaVersion(localStorage.token).catch((error) => { | ||||
| 				return ''; | ||||
| 			}); | ||||
| 		} | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
| 	import { page } from '$app/stores'; | ||||
| 
 | ||||
| 	import { models, modelfiles, user, settings, chats, chatId, config } from '$lib/stores'; | ||||
| 	import { OLLAMA_API_BASE_URL } from '$lib/constants'; | ||||
| 
 | ||||
| 	import { generateChatCompletion, generateTitle } from '$lib/apis/ollama'; | ||||
| 	import { copyToClipboard, splitStream } from '$lib/utils'; | ||||
|  | @ -163,36 +162,32 @@ | |||
| 		// Scroll down | ||||
| 		window.scrollTo({ top: document.body.scrollHeight }); | ||||
| 
 | ||||
| 		const res = await generateChatCompletion( | ||||
| 			$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 			localStorage.token, | ||||
| 			{ | ||||
| 				model: model, | ||||
| 				messages: [ | ||||
| 					$settings.system | ||||
| 						? { | ||||
| 								role: 'system', | ||||
| 								content: $settings.system | ||||
| 						  } | ||||
| 						: undefined, | ||||
| 					...messages | ||||
| 				] | ||||
| 					.filter((message) => message) | ||||
| 					.map((message) => ({ | ||||
| 						role: message.role, | ||||
| 						content: message.content, | ||||
| 						...(message.files && { | ||||
| 							images: message.files | ||||
| 								.filter((file) => file.type === 'image') | ||||
| 								.map((file) => file.url.slice(file.url.indexOf(',') + 1)) | ||||
| 						}) | ||||
| 					})), | ||||
| 				options: { | ||||
| 					...($settings.options ?? {}) | ||||
| 				}, | ||||
| 				format: $settings.requestFormat ?? undefined | ||||
| 			} | ||||
| 		); | ||||
| 		const res = await generateChatCompletion(localStorage.token, { | ||||
| 			model: model, | ||||
| 			messages: [ | ||||
| 				$settings.system | ||||
| 					? { | ||||
| 							role: 'system', | ||||
| 							content: $settings.system | ||||
| 					  } | ||||
| 					: undefined, | ||||
| 				...messages | ||||
| 			] | ||||
| 				.filter((message) => message) | ||||
| 				.map((message) => ({ | ||||
| 					role: message.role, | ||||
| 					content: message.content, | ||||
| 					...(message.files && { | ||||
| 						images: message.files | ||||
| 							.filter((file) => file.type === 'image') | ||||
| 							.map((file) => file.url.slice(file.url.indexOf(',') + 1)) | ||||
| 					}) | ||||
| 				})), | ||||
| 			options: { | ||||
| 				...($settings.options ?? {}) | ||||
| 			}, | ||||
| 			format: $settings.requestFormat ?? undefined | ||||
| 		}); | ||||
| 
 | ||||
| 		if (res && res.ok) { | ||||
| 			const reader = res.body | ||||
|  | @ -595,7 +590,6 @@ | |||
| 	const generateChatTitle = async (_chatId, userPrompt) => { | ||||
| 		if ($settings.titleAutoGenerate ?? true) { | ||||
| 			const title = await generateTitle( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token, | ||||
| 				$settings?.titleAutoGenerateModel ?? selectedModels[0], | ||||
| 				userPrompt | ||||
|  |  | |||
|  | @ -7,7 +7,6 @@ | |||
| 	import { page } from '$app/stores'; | ||||
| 
 | ||||
| 	import { models, modelfiles, user, settings, chats, chatId } from '$lib/stores'; | ||||
| 	import { OLLAMA_API_BASE_URL } from '$lib/constants'; | ||||
| 
 | ||||
| 	import { generateChatCompletion, generateTitle } from '$lib/apis/ollama'; | ||||
| 	import { copyToClipboard, splitStream } from '$lib/utils'; | ||||
|  | @ -180,36 +179,32 @@ | |||
| 		// Scroll down | ||||
| 		window.scrollTo({ top: document.body.scrollHeight }); | ||||
| 
 | ||||
| 		const res = await generateChatCompletion( | ||||
| 			$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 			localStorage.token, | ||||
| 			{ | ||||
| 				model: model, | ||||
| 				messages: [ | ||||
| 					$settings.system | ||||
| 						? { | ||||
| 								role: 'system', | ||||
| 								content: $settings.system | ||||
| 						  } | ||||
| 						: undefined, | ||||
| 					...messages | ||||
| 				] | ||||
| 					.filter((message) => message) | ||||
| 					.map((message) => ({ | ||||
| 						role: message.role, | ||||
| 						content: message.content, | ||||
| 						...(message.files && { | ||||
| 							images: message.files | ||||
| 								.filter((file) => file.type === 'image') | ||||
| 								.map((file) => file.url.slice(file.url.indexOf(',') + 1)) | ||||
| 						}) | ||||
| 					})), | ||||
| 				options: { | ||||
| 					...($settings.options ?? {}) | ||||
| 				}, | ||||
| 				format: $settings.requestFormat ?? undefined | ||||
| 			} | ||||
| 		); | ||||
| 		const res = await generateChatCompletion(localStorage.token, { | ||||
| 			model: model, | ||||
| 			messages: [ | ||||
| 				$settings.system | ||||
| 					? { | ||||
| 							role: 'system', | ||||
| 							content: $settings.system | ||||
| 					  } | ||||
| 					: undefined, | ||||
| 				...messages | ||||
| 			] | ||||
| 				.filter((message) => message) | ||||
| 				.map((message) => ({ | ||||
| 					role: message.role, | ||||
| 					content: message.content, | ||||
| 					...(message.files && { | ||||
| 						images: message.files | ||||
| 							.filter((file) => file.type === 'image') | ||||
| 							.map((file) => file.url.slice(file.url.indexOf(',') + 1)) | ||||
| 					}) | ||||
| 				})), | ||||
| 			options: { | ||||
| 				...($settings.options ?? {}) | ||||
| 			}, | ||||
| 			format: $settings.requestFormat ?? undefined | ||||
| 		}); | ||||
| 
 | ||||
| 		if (res && res.ok) { | ||||
| 			const reader = res.body | ||||
|  | @ -611,12 +606,7 @@ | |||
| 
 | ||||
| 	const generateChatTitle = async (_chatId, userPrompt) => { | ||||
| 		if ($settings.titleAutoGenerate ?? true) { | ||||
| 			const title = await generateTitle( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token, | ||||
| 				selectedModels[0], | ||||
| 				userPrompt | ||||
| 			); | ||||
| 			const title = await generateTitle(localStorage.token, selectedModels[0], userPrompt); | ||||
| 
 | ||||
| 			if (title) { | ||||
| 				await setChatTitle(_chatId, title); | ||||
|  |  | |||
|  | @ -6,7 +6,6 @@ | |||
| 	import { onMount } from 'svelte'; | ||||
| 
 | ||||
| 	import { modelfiles, settings, user } from '$lib/stores'; | ||||
| 	import { OLLAMA_API_BASE_URL } from '$lib/constants'; | ||||
| 	import { createModel, deleteModel } from '$lib/apis/ollama'; | ||||
| 	import { | ||||
| 		createNewModelfile, | ||||
|  | @ -20,11 +19,7 @@ | |||
| 	const deleteModelHandler = async (tagName) => { | ||||
| 		let success = null; | ||||
| 
 | ||||
| 		success = await deleteModel( | ||||
| 			$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 			localStorage.token, | ||||
| 			tagName | ||||
| 		); | ||||
| 		success = await deleteModel(localStorage.token, tagName); | ||||
| 
 | ||||
| 		if (success) { | ||||
| 			toast.success(`Deleted ${tagName}`); | ||||
|  |  | |||
|  | @ -2,7 +2,6 @@ | |||
| 	import { v4 as uuidv4 } from 'uuid'; | ||||
| 	import { toast } from 'svelte-french-toast'; | ||||
| 	import { goto } from '$app/navigation'; | ||||
| 	import { OLLAMA_API_BASE_URL } from '$lib/constants'; | ||||
| 	import { settings, user, config, modelfiles, models } from '$lib/stores'; | ||||
| 
 | ||||
| 	import Advanced from '$lib/components/chat/Settings/Advanced.svelte'; | ||||
|  | @ -132,12 +131,7 @@ SYSTEM """${system}"""`.replace(/^\s*\n/gm, ''); | |||
| 			Object.keys(categories).filter((category) => categories[category]).length > 0 && | ||||
| 			!$models.includes(tagName) | ||||
| 		) { | ||||
| 			const res = await createModel( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token, | ||||
| 				tagName, | ||||
| 				content | ||||
| 			); | ||||
| 			const res = await createModel(localStorage.token, tagName, content); | ||||
| 
 | ||||
| 			if (res) { | ||||
| 				const reader = res.body | ||||
|  |  | |||
|  | @ -7,8 +7,6 @@ | |||
| 	import { page } from '$app/stores'; | ||||
| 
 | ||||
| 	import { settings, user, config, modelfiles } from '$lib/stores'; | ||||
| 
 | ||||
| 	import { OLLAMA_API_BASE_URL } from '$lib/constants'; | ||||
| 	import { splitStream } from '$lib/utils'; | ||||
| 
 | ||||
| 	import { createModel } from '$lib/apis/ollama'; | ||||
|  | @ -104,12 +102,7 @@ | |||
| 			content !== '' && | ||||
| 			Object.keys(categories).filter((category) => categories[category]).length > 0 | ||||
| 		) { | ||||
| 			const res = await createModel( | ||||
| 				$settings?.API_BASE_URL ?? OLLAMA_API_BASE_URL, | ||||
| 				localStorage.token, | ||||
| 				tagName, | ||||
| 				content | ||||
| 			); | ||||
| 			const res = await createModel(localStorage.token, tagName, content); | ||||
| 
 | ||||
| 			if (res) { | ||||
| 				const reader = res.body | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek