forked from open-webui/open-webui
		
	feat: split large openai responses into smaller chunkers
This commit is contained in:
		
							parent
							
								
									a4083f43cb
								
							
						
					
					
						commit
						efa258c695
					
				
					 3 changed files with 90 additions and 55 deletions
				
			
		|  | @ -39,6 +39,7 @@ | |||
| 	import { RAGTemplate } from '$lib/utils/rag'; | ||||
| 	import { LITELLM_API_BASE_URL, OLLAMA_API_BASE_URL, OPENAI_API_BASE_URL } from '$lib/constants'; | ||||
| 	import { WEBUI_BASE_URL } from '$lib/constants'; | ||||
| 	import { createOpenAITextStream } from '$lib/apis/streaming'; | ||||
| 
 | ||||
| 	const i18n = getContext('i18n'); | ||||
| 
 | ||||
|  | @ -599,38 +600,22 @@ | |||
| 				.pipeThrough(splitStream('\n')) | ||||
| 				.getReader(); | ||||
| 
 | ||||
| 			while (true) { | ||||
| 				const { value, done } = await reader.read(); | ||||
| 			const textStream = await createOpenAITextStream(reader); | ||||
| 			console.log(textStream); | ||||
| 
 | ||||
| 			for await (const update of textStream) { | ||||
| 				const { value, done } = update; | ||||
| 				if (done || stopResponseFlag || _chatId !== $chatId) { | ||||
| 					responseMessage.done = true; | ||||
| 					messages = messages; | ||||
| 					break; | ||||
| 				} | ||||
| 
 | ||||
| 				try { | ||||
| 					let lines = value.split('\n'); | ||||
| 
 | ||||
| 					for (const line of lines) { | ||||
| 						if (line !== '') { | ||||
| 							console.log(line); | ||||
| 							if (line === 'data: [DONE]') { | ||||
| 								responseMessage.done = true; | ||||
| 								messages = messages; | ||||
| 							} else { | ||||
| 								let data = JSON.parse(line.replace(/^data: /, '')); | ||||
| 								console.log(data); | ||||
| 
 | ||||
| 								if (responseMessage.content == '' && data.choices[0].delta.content == '\n') { | ||||
| 									continue; | ||||
| 								} else { | ||||
| 									responseMessage.content += data.choices[0].delta.content ?? ''; | ||||
| 									messages = messages; | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} catch (error) { | ||||
| 					console.log(error); | ||||
| 				if (responseMessage.content == '' && value == '\n') { | ||||
| 					continue; | ||||
| 				} else { | ||||
| 					responseMessage.content += value; | ||||
| 					messages = messages; | ||||
| 				} | ||||
| 
 | ||||
| 				if ($settings.notificationEnabled && !document.hasFocus()) { | ||||
|  |  | |||
|  | @ -42,6 +42,7 @@ | |||
| 		OLLAMA_API_BASE_URL, | ||||
| 		WEBUI_BASE_URL | ||||
| 	} from '$lib/constants'; | ||||
| 	import { createOpenAITextStream } from '$lib/apis/streaming'; | ||||
| 
 | ||||
| 	const i18n = getContext('i18n'); | ||||
| 
 | ||||
|  | @ -551,9 +552,9 @@ | |||
| 				messages: [ | ||||
| 					$settings.system | ||||
| 						? { | ||||
| 								role: 'system', | ||||
| 								content: $settings.system | ||||
| 						  } | ||||
| 							role: 'system', | ||||
| 							content: $settings.system | ||||
| 						} | ||||
| 						: undefined, | ||||
| 					...messages | ||||
| 				] | ||||
|  | @ -611,38 +612,22 @@ | |||
| 				.pipeThrough(splitStream('\n')) | ||||
| 				.getReader(); | ||||
| 
 | ||||
| 			while (true) { | ||||
| 				const { value, done } = await reader.read(); | ||||
| 			const textStream = await createOpenAITextStream(reader); | ||||
| 			console.log(textStream); | ||||
| 
 | ||||
| 			for await (const update of textStream) { | ||||
| 				const { value, done } = update; | ||||
| 				if (done || stopResponseFlag || _chatId !== $chatId) { | ||||
| 					responseMessage.done = true; | ||||
| 					messages = messages; | ||||
| 					break; | ||||
| 				} | ||||
| 
 | ||||
| 				try { | ||||
| 					let lines = value.split('\n'); | ||||
| 
 | ||||
| 					for (const line of lines) { | ||||
| 						if (line !== '') { | ||||
| 							console.log(line); | ||||
| 							if (line === 'data: [DONE]') { | ||||
| 								responseMessage.done = true; | ||||
| 								messages = messages; | ||||
| 							} else { | ||||
| 								let data = JSON.parse(line.replace(/^data: /, '')); | ||||
| 								console.log(data); | ||||
| 
 | ||||
| 								if (responseMessage.content == '' && data.choices[0].delta.content == '\n') { | ||||
| 									continue; | ||||
| 								} else { | ||||
| 									responseMessage.content += data.choices[0].delta.content ?? ''; | ||||
| 									messages = messages; | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} catch (error) { | ||||
| 					console.log(error); | ||||
| 				if (responseMessage.content == '' && value == '\n') { | ||||
| 					continue; | ||||
| 				} else { | ||||
| 					responseMessage.content += value; | ||||
| 					messages = messages; | ||||
| 				} | ||||
| 
 | ||||
| 				if ($settings.notificationEnabled && !document.hasFocus()) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Jun Siang Cheah
						Jun Siang Cheah