| 
									
										
										
										
											2024-09-21 07:07:57 +08:00
										 |  |  | import json | 
					
						
							| 
									
										
										
										
											2024-09-21 06:30:13 +08:00
										 |  |  | from open_webui.utils.misc import ( | 
					
						
							| 
									
										
										
										
											2024-09-21 07:07:57 +08:00
										 |  |  |     openai_chat_chunk_message_template, | 
					
						
							| 
									
										
										
										
											2024-09-21 06:30:13 +08:00
										 |  |  |     openai_chat_completion_message_template, | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def convert_response_ollama_to_openai(ollama_response: dict) -> dict: | 
					
						
							|  |  |  |     model = ollama_response.get("model", "ollama") | 
					
						
							|  |  |  |     message_content = ollama_response.get("message", {}).get("content", "") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-01-30 13:07:22 +08:00
										 |  |  |     data = ollama_response | 
					
						
							|  |  |  |     usage = { | 
					
						
							|  |  |  |         "response_token/s": ( | 
					
						
							|  |  |  |             round( | 
					
						
							|  |  |  |                 ( | 
					
						
							|  |  |  |                     ( | 
					
						
							|  |  |  |                         data.get("eval_count", 0) | 
					
						
							|  |  |  |                         / ((data.get("eval_duration", 0) / 10_000_000)) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     * 100 | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 2, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             if data.get("eval_duration", 0) > 0 | 
					
						
							|  |  |  |             else "N/A" | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         "prompt_token/s": ( | 
					
						
							|  |  |  |             round( | 
					
						
							|  |  |  |                 ( | 
					
						
							|  |  |  |                     ( | 
					
						
							|  |  |  |                         data.get("prompt_eval_count", 0) | 
					
						
							|  |  |  |                         / ((data.get("prompt_eval_duration", 0) / 10_000_000)) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     * 100 | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 2, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             if data.get("prompt_eval_duration", 0) > 0 | 
					
						
							|  |  |  |             else "N/A" | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |         "total_duration": data.get("total_duration", 0), | 
					
						
							|  |  |  |         "load_duration": data.get("load_duration", 0), | 
					
						
							|  |  |  |         "prompt_eval_count": data.get("prompt_eval_count", 0), | 
					
						
							|  |  |  |         "prompt_eval_duration": data.get("prompt_eval_duration", 0), | 
					
						
							|  |  |  |         "eval_count": data.get("eval_count", 0), | 
					
						
							|  |  |  |         "eval_duration": data.get("eval_duration", 0), | 
					
						
							|  |  |  |         "approximate_total": (lambda s: f"{s // 3600}h{(s % 3600) // 60}m{s % 60}s")( | 
					
						
							|  |  |  |             (data.get("total_duration", 0) or 0) // 1_000_000_000 | 
					
						
							|  |  |  |         ), | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     response = openai_chat_completion_message_template(model, message_content, usage) | 
					
						
							| 
									
										
										
										
											2024-09-21 06:30:13 +08:00
										 |  |  |     return response | 
					
						
							| 
									
										
										
										
											2024-09-21 07:07:57 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async def convert_streaming_response_ollama_to_openai(ollama_streaming_response): | 
					
						
							|  |  |  |     async for data in ollama_streaming_response.body_iterator: | 
					
						
							|  |  |  |         data = json.loads(data) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         model = data.get("model", "ollama") | 
					
						
							|  |  |  |         message_content = data.get("message", {}).get("content", "") | 
					
						
							|  |  |  |         done = data.get("done", False) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |         usage = None | 
					
						
							|  |  |  |         if done: | 
					
						
							|  |  |  |             usage = { | 
					
						
							|  |  |  |                 "response_token/s": ( | 
					
						
							|  |  |  |                     round( | 
					
						
							|  |  |  |                         ( | 
					
						
							|  |  |  |                             ( | 
					
						
							|  |  |  |                                 data.get("eval_count", 0) | 
					
						
							| 
									
										
										
										
											2024-12-31 07:52:07 +08:00
										 |  |  |                                 / ((data.get("eval_duration", 0) / 10_000_000)) | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |                             ) | 
					
						
							|  |  |  |                             * 100 | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         2, | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     if data.get("eval_duration", 0) > 0 | 
					
						
							|  |  |  |                     else "N/A" | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 "prompt_token/s": ( | 
					
						
							|  |  |  |                     round( | 
					
						
							|  |  |  |                         ( | 
					
						
							|  |  |  |                             ( | 
					
						
							|  |  |  |                                 data.get("prompt_eval_count", 0) | 
					
						
							| 
									
										
										
										
											2024-12-31 07:52:07 +08:00
										 |  |  |                                 / ((data.get("prompt_eval_duration", 0) / 10_000_000)) | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |                             ) | 
					
						
							|  |  |  |                             * 100 | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         2, | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     if data.get("prompt_eval_duration", 0) > 0 | 
					
						
							|  |  |  |                     else "N/A" | 
					
						
							|  |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2024-12-27 12:35:14 +08:00
										 |  |  |                 "total_duration": data.get("total_duration", 0), | 
					
						
							|  |  |  |                 "load_duration": data.get("load_duration", 0), | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |                 "prompt_eval_count": data.get("prompt_eval_count", 0), | 
					
						
							| 
									
										
										
										
											2024-12-27 12:35:14 +08:00
										 |  |  |                 "prompt_eval_duration": data.get("prompt_eval_duration", 0), | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |                 "eval_count": data.get("eval_count", 0), | 
					
						
							| 
									
										
										
										
											2024-12-27 12:35:14 +08:00
										 |  |  |                 "eval_duration": data.get("eval_duration", 0), | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |                 "approximate_total": ( | 
					
						
							|  |  |  |                     lambda s: f"{s // 3600}h{(s % 3600) // 60}m{s % 60}s" | 
					
						
							|  |  |  |                 )((data.get("total_duration", 0) or 0) // 1_000_000_000), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-21 07:07:57 +08:00
										 |  |  |         data = openai_chat_chunk_message_template( | 
					
						
							| 
									
										
										
										
											2024-12-13 15:31:08 +08:00
										 |  |  |             model, message_content if not done else None, usage | 
					
						
							| 
									
										
										
										
											2024-09-21 07:07:57 +08:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         line = f"data: {json.dumps(data)}\n\n" | 
					
						
							|  |  |  |         yield line | 
					
						
							| 
									
										
										
										
											2024-10-22 04:45:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     yield "data: [DONE]\n\n" |