forked from open-webui/open-webui
		
	chat event stream behaviour updated
This commit is contained in:
		
							parent
							
								
									568ce38fa1
								
							
						
					
					
						commit
						83ae37f154
					
				
					 1 changed files with 50 additions and 17 deletions
				
			
		|  | @ -18,19 +18,41 @@ | ||||||
| 
 | 
 | ||||||
| 	let textareaElement = ''; | 	let textareaElement = ''; | ||||||
| 
 | 
 | ||||||
|  | 	const splitStream = (splitOn) => { | ||||||
|  | 		let buffer = ''; | ||||||
|  | 		return new TransformStream({ | ||||||
|  | 			transform(chunk, controller) { | ||||||
|  | 				buffer += chunk; | ||||||
|  | 				const parts = buffer.split(splitOn); | ||||||
|  | 				parts.slice(0, -1).forEach((part) => controller.enqueue(part)); | ||||||
|  | 				buffer = parts[parts.length - 1]; | ||||||
|  | 			}, | ||||||
|  | 			flush(controller) { | ||||||
|  | 				if (buffer) controller.enqueue(buffer); | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
| 	const submitPrompt = async () => { | 	const submitPrompt = async () => { | ||||||
| 		console.log('submitPrompt'); | 		console.log('submitPrompt'); | ||||||
|  | 
 | ||||||
| 		if (selectedModel !== '') { | 		if (selectedModel !== '') { | ||||||
| 			console.log(prompt); | 			console.log(prompt); | ||||||
| 
 | 
 | ||||||
| 			let user_prompt = prompt; | 			let user_prompt = prompt; | ||||||
|  | 
 | ||||||
| 			chatHistory[Object.keys(chatHistory).length] = { | 			chatHistory[Object.keys(chatHistory).length] = { | ||||||
| 				role: 'user', | 				role: 'user', | ||||||
| 				content: user_prompt | 				content: user_prompt | ||||||
| 			}; | 			}; | ||||||
|  | 
 | ||||||
| 			prompt = ''; | 			prompt = ''; | ||||||
| 			textareaElement.style.height = ''; | 			textareaElement.style.height = ''; | ||||||
| 
 | 
 | ||||||
|  | 			setTimeout(() => { | ||||||
|  | 				window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' }); | ||||||
|  | 			}, 50); | ||||||
|  | 
 | ||||||
| 			const res = await fetch(`${ENDPOINT}/api/generate`, { | 			const res = await fetch(`${ENDPOINT}/api/generate`, { | ||||||
| 				method: 'POST', | 				method: 'POST', | ||||||
| 				headers: { | 				headers: { | ||||||
|  | @ -47,36 +69,47 @@ | ||||||
| 				role: 'assistant', | 				role: 'assistant', | ||||||
| 				content: '' | 				content: '' | ||||||
| 			}; | 			}; | ||||||
|  | 			window.scrollTo({ top: document.body.scrollHeight }); | ||||||
| 
 | 
 | ||||||
| 			const reader = res.body.pipeThrough(new TextDecoderStream()).getReader(); | 			const reader = res.body | ||||||
|  | 				.pipeThrough(new TextDecoderStream()) | ||||||
|  | 				.pipeThrough(splitStream('\n')) | ||||||
|  | 				.getReader(); | ||||||
| 			while (true) { | 			while (true) { | ||||||
| 				const { value, done } = await reader.read(); | 				const { value, done } = await reader.read(); | ||||||
| 				if (done) break; | 				if (done) break; | ||||||
| 
 | 
 | ||||||
| 				// toast.success(value); |  | ||||||
| 				try { | 				try { | ||||||
| 					let data = JSON.parse(value); | 					let lines = value.split('\n'); | ||||||
| 					console.log(data); |  | ||||||
| 
 | 
 | ||||||
| 					if (data.done == false) { | 					for (const line of lines) { | ||||||
| 						if ( | 						if (line !== '') { | ||||||
| 							chatHistory[Object.keys(chatHistory).length - 1].content == '' && | 							console.log(line); | ||||||
| 							data.response == '\n' | 							let data = JSON.parse(line); | ||||||
| 						) { | 
 | ||||||
| 							continue; | 							if (data.done == false) { | ||||||
| 						} else { | 								if ( | ||||||
| 							chatHistory[Object.keys(chatHistory).length - 1].content += data.response; | 									chatHistory[Object.keys(chatHistory).length - 1].content == '' && | ||||||
|  | 									data.response == '\n' | ||||||
|  | 								) { | ||||||
|  | 									continue; | ||||||
|  | 								} else { | ||||||
|  | 									chatHistory[Object.keys(chatHistory).length - 1].content += data.response; | ||||||
|  | 								} | ||||||
|  | 							} else { | ||||||
|  | 								context = data.context; | ||||||
|  | 								console.log(context); | ||||||
|  | 								chatHistory[Object.keys(chatHistory).length - 1].done = true; | ||||||
|  | 							} | ||||||
| 						} | 						} | ||||||
| 					} else { |  | ||||||
| 						context = data.context; |  | ||||||
| 						console.log(context); |  | ||||||
| 						chatHistory[Object.keys(chatHistory).length - 1].done = true; |  | ||||||
| 					} | 					} | ||||||
| 				} catch (error) { | 				} catch (error) { | ||||||
| 					console.log(error); | 					console.log(error); | ||||||
| 				} | 				} | ||||||
| 				window.scrollTo(0, document.body.scrollHeight); | 				window.scrollTo({ top: document.body.scrollHeight }); | ||||||
| 			} | 			} | ||||||
|  | 
 | ||||||
|  | 			window.scrollTo({ top: document.body.scrollHeight }); | ||||||
| 		} else { | 		} else { | ||||||
| 			toast.error('Model not selected'); | 			toast.error('Model not selected'); | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Timothy J. Baek
						Timothy J. Baek