2024-10-16 22:32:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  asyncio  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  inspect  
						 
					
						
							
								
									
										
										
										
											2024-02-23 16:30:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  json  
						 
					
						
							
								
									
										
										
										
											2024-03-21 07:11:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  logging  
						 
					
						
							
								
									
										
										
										
											2024-05-22 06:04:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  mimetypes  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  os  
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  shutil  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  sys  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  time  
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  random  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  contextlib  import  asynccontextmanager  
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:11:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  typing  import  Optional  
						 
					
						
							
								
									
										
										
										
											2024-02-23 16:30:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								import  aiohttp  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  requests  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  fastapi  import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Depends , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    FastAPI , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    File , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Form , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    HTTPException , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Request , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    UploadFile , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    status , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  fastapi . middleware . cors  import  CORSMiddleware  
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  fastapi . responses  import  JSONResponse ,  RedirectResponse  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  fastapi . staticfiles  import  StaticFiles  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  pydantic  import  BaseModel  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  sqlalchemy  import  text  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  starlette . exceptions  import  HTTPException  as  StarletteHTTPException  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  starlette . middleware . base  import  BaseHTTPMiddleware  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  starlette . middleware . sessions  import  SessionMiddleware  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  starlette . responses  import  Response ,  StreamingResponse  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  open_webui . apps . audio . main  import  app  as  audio_app  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . images . main  import  app  as  images_app  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . ollama . main  import  (  
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    app  as  ollama_app , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_all_models  as  get_ollama_models , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    generate_chat_completion  as  generate_ollama_chat_completion , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    GenerateChatCompletionForm , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 04:17:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . openai . main  import  (  
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    app  as  openai_app , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    generate_chat_completion  as  generate_openai_chat_completion , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    get_all_models  as  get_openai_models , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  open_webui . apps . retrieval . main  import  app  as  retrieval_app  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . retrieval . utils  import  get_rag_context ,  rag_template  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . socket . main  import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app  as  socket_app , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    periodic_usage_pool_cleanup , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_event_call , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_event_emitter , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  open_webui . apps . webui . internal . db  import  Session  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . webui . main  import  (  
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    app  as  webui_app , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    generate_function_chat_completion , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:14:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    get_all_models  as  get_open_webui_models , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . webui . models . functions  import  Functions  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . webui . models . models  import  Models  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . webui . models . users  import  UserModel ,  Users  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . apps . webui . utils  import  load_function_module_by_id  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . config  import  (  
						 
					
						
							
								
									
										
										
										
											2024-04-09 18:32:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    CACHE_DIR , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    CORS_ALLOW_ORIGIN , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-01 05:48:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    DEFAULT_LOCALE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ENABLE_ADMIN_CHAT_ACCESS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ENABLE_ADMIN_EXPORT , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-27 05:17:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ENABLE_MODEL_FILTER , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ENABLE_OLLAMA_API , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ENABLE_OPENAI_API , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ENV , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    FRONTEND_BUILD_DIR , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    MODEL_FILTER_LIST , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    OAUTH_PROVIDERS , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ENABLE_SEARCH_QUERY , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    STATIC_DIR , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    TASK_MODEL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TASK_MODEL_EXTERNAL , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    TITLE_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TAGS_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    WEBHOOK_URL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    WEBUI_AUTH , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    WEBUI_NAME , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    AppConfig , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 07:06:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    reset_config , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:58:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  open_webui . constants  import  TASKS  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . env  import  (  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    CHANGELOG , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    GLOBAL_LOG_LEVEL , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 10:28:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    SAFE_MODE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    SRC_LOG_LEVELS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    VERSION , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    WEBUI_BUILD_HASH , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    WEBUI_SECRET_KEY , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 02:21:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    WEBUI_SESSION_COOKIE_SAME_SITE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-07 16:13:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    WEBUI_SESSION_COOKIE_SECURE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    WEBUI_URL , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-25 07:06:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    RESET_CONFIG_ON_START , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 13:13:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    OFFLINE_MODE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . misc  import  (  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    add_or_update_system_message , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_last_user_message , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    prepend_to_first_user_message_content , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:32:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  open_webui . utils . oauth  import  oauth_manager  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . payload  import  convert_payload_openai_to_ollama  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . response  import  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    convert_response_ollama_to_openai , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    convert_streaming_response_ollama_to_openai , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . security_headers  import  SecurityHeadersMiddleware  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . task  import  (  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    moa_response_generation_template , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 11:34:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    tags_generation_template , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    search_query_generation_template , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 02:23:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    emoji_generation_template , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    title_generation_template , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    tools_function_calling_generation_template , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-04 22:54:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . tools  import  get_tools  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  open_webui . utils . utils  import  (  
						 
					
						
							
								
									
										
										
										
											2024-08-28 06:10:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    decode_token , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_admin_user , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_current_user , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_http_authorization_cred , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    get_verified_user , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 10:28:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								if  SAFE_MODE :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " SAFE MODE ENABLED " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    Functions . deactivate_all_functions ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 07:11:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								logging . basicConfig ( stream = sys . stdout ,  level = GLOBAL_LOG_LEVEL )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								log  =  logging . getLogger ( __name__ )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								log . setLevel ( SRC_LOG_LEVELS [ " MAIN " ] )  
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-28 17:45:56 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  SPAStaticFiles ( StaticFiles ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    async  def  get_response ( self ,  path :  str ,  scope ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  await  super ( ) . get_response ( path ,  scope ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  ( HTTPException ,  StarletteHTTPException )  as  ex : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  ex . status_code  ==  404 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  await  super ( ) . get_response ( " index.html " ,  scope ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  ex 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								print (  
						 
					
						
							
								
									
										
										
										
											2024-05-04 05:23:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    rf """ 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 13:13:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  ___                     __         __    _      _    _  ___ 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 /  _  \ _  __    ___  _  __    \ \      /  / __ |  | __  |  |  |  | _  _ | 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 13:13:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								|  |  |  |  ' _  \  / _  \   ' _  \   \ \ / \ /  /  _  \ ' _  \ | | | || |  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								|  | _ |  |  | _ )  |   __ /  |  |  |    \ V   V  /   __ /  | _ )  |  | _ |  | |  |  
						 
					
						
							
								
									
										
										
										
											2024-04-02 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								 \___ / |  . __ /  \___ | _ |  | _ |     \_ / \_ /  \___ | _ . __ /  \___ / | ___ | 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 13:13:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								      | _ | 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-02 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-23 03:22:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								v { VERSION }  -  building  the  best  open - source  AI  user  interface .  
						 
					
						
							
								
									
										
										
										
											2024-05-26 15:49:30 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{ f " Commit:  { WEBUI_BUILD_HASH } "  if  WEBUI_BUILD_HASH  !=  " dev-build "  else  " " }  
						 
					
						
							
								
									
										
										
										
											2024-04-02 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								https : / / github . com / open - webui / open - webui  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								""" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-09 12:00:03 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@asynccontextmanager  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  lifespan ( app :  FastAPI ) :  
						 
					
						
							
								
									
										
										
										
											2024-09-25 07:06:11 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  RESET_CONFIG_ON_START : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        reset_config ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-24 23:43:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    asyncio . create_task ( periodic_usage_pool_cleanup ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-09 12:00:03 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    yield 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app  =  FastAPI (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    docs_url = " /docs "  if  ENV  ==  " dev "  else  None ,  redoc_url = None ,  lifespan = lifespan 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config  =  AppConfig ( )  
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . config . ENABLE_OPENAI_API  =  ENABLE_OPENAI_API  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . config . ENABLE_OLLAMA_API  =  ENABLE_OLLAMA_API  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config . ENABLE_MODEL_FILTER  =  ENABLE_MODEL_FILTER  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . config . MODEL_FILTER_LIST  =  MODEL_FILTER_LIST  
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config . WEBHOOK_URL  =  WEBHOOK_URL  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . config . TASK_MODEL  =  TASK_MODEL  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . config . TASK_MODEL_EXTERNAL  =  TASK_MODEL_EXTERNAL  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE  =  TITLE_GENERATION_PROMPT_TEMPLATE  
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE  =  TAGS_GENERATION_PROMPT_TEMPLATE  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE  =  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								app . state . config . ENABLE_SEARCH_QUERY  =  ENABLE_SEARCH_QUERY  
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE  =  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2024-05-25 09:26:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . state . MODELS  =  { }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-17 11:49:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# ChatCompletion Middleware  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:37:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								def  get_task_model_id ( default_model_id ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Set the task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    task_model_id  =  default_model_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model and use that model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  app . state . MODELS [ task_model_id ] [ " owned_by " ]  ==  " ollama " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            app . state . config . TASK_MODEL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            and  app . state . config . TASK_MODEL  in  app . state . MODELS 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:37:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            task_model_id  =  app . state . config . TASK_MODEL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            app . state . config . TASK_MODEL_EXTERNAL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            and  app . state . config . TASK_MODEL_EXTERNAL  in  app . state . MODELS 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:37:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            task_model_id  =  app . state . config . TASK_MODEL_EXTERNAL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  task_model_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  get_filter_function_ids ( model ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    def  get_priority ( function_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function  =  Functions . get_function_by_id ( function_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  function  is  not  None  and  hasattr ( function ,  " valves " ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            # TODO: Fix FunctionModel 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:37:54 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            return  ( function . valves  if  function . valves  else  { } ) . get ( " priority " ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids  =  [ function . id  for  function  in  Functions . get_global_filter_functions ( ) ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  " info "  in  model  and  " meta "  in  model [ " info " ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter_ids . extend ( model [ " info " ] [ " meta " ] . get ( " filterIds " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter_ids  =  list ( set ( filter_ids ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enabled_filter_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function . id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  function  in  Functions . get_functions_by_type ( " filter " ,  active_only = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter_id  for  filter_id  in  filter_ids  if  filter_id  in  enabled_filter_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids . sort ( key = get_priority ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  filter_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:00:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  chat_completion_filter_functions_handler ( body ,  model ,  extra_params ) :  
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    skip_files  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids  =  get_filter_function_ids ( model ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  filter_id  in  filter_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter  =  Functions . get_function_by_id ( filter_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  filter : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 04:04:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  filter_id  in  webui_app . state . FUNCTIONS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module  =  webui_app . state . FUNCTIONS [ filter_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module ,  _ ,  _  =  load_function_module_by_id ( filter_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webui_app . state . FUNCTIONS [ filter_id ]  =  function_module 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Check if the function has a file_handler variable 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  hasattr ( function_module ,  " file_handler " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            skip_files  =  function_module . file_handler 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  hasattr ( function_module ,  " valves " )  and  hasattr ( function_module ,  " Valves " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            valves  =  Functions . get_function_valves_by_id ( filter_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module . valves  =  function_module . Valves ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * * ( valves  if  valves  else  { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  hasattr ( function_module ,  " inlet " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            inlet  =  function_module . inlet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Get the signature of the function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sig  =  inspect . signature ( inlet ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            params  =  { " body " :  body }  |  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                k :  v 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  k ,  v  in  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    * * extra_params , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " __model__ " :  model , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " __id__ " :  filter_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } . items ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  k  in  sig . parameters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  " __user__ "  in  params  and  hasattr ( function_module ,  " UserValves " ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 16:07:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    params [ " __user__ " ] [ " valves " ]  =  function_module . UserValves ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        * * Functions . get_user_valves_by_id_and_user_id ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            filter_id ,  params [ " __user__ " ] [ " id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 16:07:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    print ( e ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  inspect . iscoroutinefunction ( inlet ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                body  =  await  inlet ( * * params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                body  =  inlet ( * * params ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  e 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 17:30:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  skip_files  and  " files "  in  body . get ( " metadata " ,  { } ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  body [ " metadata " ] [ " files " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  body ,  { } 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 16:10:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 17:06:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:41:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								def  get_tools_function_calling_payload ( messages ,  task_model_id ,  content ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user_message  =  get_last_user_message ( messages ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    history  =  " \n " . join ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        f " { message [ ' role ' ] . upper ( ) } :  \" \" \" { message [ ' content ' ] } \" \" \" " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  message  in  messages [ : : - 1 ] [ : 4 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    prompt  =  f " History: \n { history } \n Query:  { user_message } " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { " role " :  " system " ,  " content " :  content } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { " role " :  " user " ,  " content " :  f " Query:  { prompt } " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " metadata " :  { " task " :  str ( TASKS . FUNCTION_CALLING ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:24:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_content_from_response ( response )  - >  Optional [ str ] :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    content  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  hasattr ( response ,  " body_iterator " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        async  for  chunk  in  response . body_iterator : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  json . loads ( chunk . decode ( " utf-8 " ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            content  =  data [ " choices " ] [ 0 ] [ " message " ] [ " content " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Cleanup any remaining background tasks if necessary 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  response . background  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            await  response . background ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        content  =  response [ " choices " ] [ 0 ] [ " message " ] [ " content " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  content 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 22:16:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  chat_completion_tools_handler (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    body :  dict ,  user :  UserModel ,  extra_params :  dict 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 22:16:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								)  - >  tuple [ dict ,  dict ] :  
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:11:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    # If tool_ids field is present, call the functions 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    metadata  =  body . get ( " metadata " ,  { } ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    tool_ids  =  metadata . get ( " tool_ids " ,  None ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( f " { tool_ids =} " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:11:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  not  tool_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  body ,  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 21:48:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    skip_files  =  False 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    contexts  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 21:48:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    citations  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:24:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( body [ " model " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    tools  =  get_tools ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webui_app , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        tool_ids , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        user , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * * extra_params , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " __model__ " :  app . state . MODELS [ task_model_id ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " __messages__ " :  body [ " messages " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " __files__ " :  metadata . get ( " files " ,  [ ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:24:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . info ( f " { tools =} " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 21:48:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:24:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    specs  =  [ tool [ " spec " ]  for  tool  in  tools . values ( ) ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    tools_specs  =  json . dumps ( specs ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:27:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE  !=  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  """ Available Tools:  {{ TOOLS}} \n Return an empty string if no tools match the query. If a function tool matches, construct and return a JSON object in the format  { \" name \" :  \" functionName \" ,  \" parameters \" :  { \" requiredFunctionParamKey \" :  \" requiredFunctionParamValue \" }} using the appropriate tool and its parameters. Only return the object and limit the response to the JSON object without additional text. """ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 23:01:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    tools_function_calling_prompt  =  tools_function_calling_generation_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        template ,  tools_specs 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:32:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 23:01:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . info ( f " { tools_function_calling_prompt =} " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:32:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    payload  =  get_tools_function_calling_payload ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 23:01:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        body [ " messages " ] ,  task_model_id ,  tools_function_calling_prompt 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:32:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:24:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  e 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response  =  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( f " { response =} " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        content  =  await  get_content_from_response ( response ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( f " { content =} " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:27:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 00:04:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  content : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            return  body ,  { } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-29 01:51:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            content  =  content [ content . find ( " { " )  :  content . rfind ( " } " )  +  1 ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  not  content : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  Exception ( " No JSON object found in the response " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            result  =  json . loads ( content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tool_function_name  =  result . get ( " name " ,  None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  tool_function_name  not  in  tools : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  body ,  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            tool_function_params  =  result . get ( " parameters " ,  { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-26 05:36:44 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                tool_function  =  tools [ tool_function_name ] [ " callable " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                sig  =  inspect . signature ( tool_function ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tool_function_params  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    k :  v 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    for  k ,  v  in  tool_function_params . items ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  k  in  sig . parameters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tool_output  =  await  tool_function ( * * tool_function_params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                
							 
						 
					
						
							
								
									
										
										
										
											2024-09-29 01:51:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                tool_output  =  str ( e ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  tools [ tool_function_name ] [ " citation " ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                citations . append ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " source " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " name " :  f " TOOL: { tools [ tool_function_name ] [ ' toolkit_id ' ] } / { tool_function_name } " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " document " :  [ tool_output ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " metadata " :  [ { " source " :  tool_function_name } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  tools [ tool_function_name ] [ " file_handler " ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                skip_files  =  True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  isinstance ( tool_output ,  str ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                contexts . append ( tool_output ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 18:58:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-29 01:51:28 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            log . exception ( f " Error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            content  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 18:03:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        log . exception ( f " Error:  { e } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 22:53:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        content  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 18:58:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 22:16:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( f " tool_contexts:  { contexts } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  skip_files  and  " files "  in  body . get ( " metadata " ,  { } ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  body [ " metadata " ] [ " files " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-12 21:48:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  body ,  { " contexts " :  contexts ,  " citations " :  citations } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 03:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  chat_completion_files_handler ( body )  - >  tuple [ dict ,  dict [ str ,  list ] ] :  
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    contexts  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 03:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    citations  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  files  :=  body . get ( " metadata " ,  { } ) . get ( " files " ,  None ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        contexts ,  citations  =  get_rag_context ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            files = files , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            messages = body [ " messages " ] , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            embedding_function = retrieval_app . state . EMBEDDING_FUNCTION , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            k = retrieval_app . state . config . TOP_K , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            reranking_function = retrieval_app . state . sentence_transformer_rf , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r = retrieval_app . state . config . RELEVANCE_THRESHOLD , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            hybrid_search = retrieval_app . state . config . ENABLE_RAG_HYBRID_SEARCH , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( f " rag_contexts:  { contexts } , citations:  { citations } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 03:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  body ,  { " contexts " :  contexts ,  " citations " :  citations } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								def  is_chat_completion_request ( request ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  request . method  ==  " POST "  and  any ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        endpoint  in  request . url . path 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  endpoint  in  [ " /ollama/api/chat " ,  " /chat/completions " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:41:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_body_and_model_and_user ( request ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Read the original request body 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    body  =  await  request . body ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    body_str  =  body . decode ( " utf-8 " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    body  =  json . loads ( body_str )  if  body_str  else  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  body [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  Exception ( " Model not found " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user  =  get_current_user ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        request , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        get_http_authorization_cred ( request . headers . get ( " Authorization " ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  body ,  model ,  user 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  ChatCompletionMiddleware ( BaseHTTPMiddleware ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    async  def  dispatch ( self ,  request :  Request ,  call_next ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  is_chat_completion_request ( request ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( f " request.url.path:  { request . url . path } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            body ,  model ,  user  =  await  get_body_and_model_and_user ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 21:01:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        metadata  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " chat_id " :  body . pop ( " chat_id " ,  None ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " message_id " :  body . pop ( " id " ,  None ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " session_id " :  body . pop ( " session_id " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 07:08:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " tool_ids " :  body . get ( " tool_ids " ,  None ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " files " :  body . get ( " files " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-21 00:41:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        body [ " metadata " ]  =  metadata 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 12:39:06 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        extra_params  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " __event_emitter__ " :  get_event_emitter ( metadata ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " __event_call__ " :  get_event_call ( metadata ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 22:02:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " __user__ " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " id " :  user . id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " email " :  user . email , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " role " :  user . role , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Initialize data_items to store additional data to be sent to the client 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-14 15:13:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Initialize contexts and citation 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        data_items  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        contexts  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        citations  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-17 22:00:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            body ,  flags  =  await  chat_completion_filter_functions_handler ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                body ,  model ,  extra_params 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-22 07:08:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        metadata  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * * metadata , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " tool_ids " :  body . pop ( " tool_ids " ,  None ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " files " :  body . pop ( " files " ,  None ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        body [ " metadata " ]  =  metadata 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            body ,  flags  =  await  chat_completion_tools_handler ( body ,  user ,  extra_params ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            contexts . extend ( flags . get ( " contexts " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            citations . extend ( flags . get ( " citations " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 03:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            log . exception ( e ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            body ,  flags  =  await  chat_completion_files_handler ( body ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            contexts . extend ( flags . get ( " contexts " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            citations . extend ( flags . get ( " citations " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 03:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            log . exception ( e ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # If context is not empty, insert it into the messages 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  len ( contexts )  >  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            context_string  =  " /n " . join ( contexts ) . strip ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            prompt  =  get_last_user_message ( body [ " messages " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-13 13:07:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:11:41 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  prompt  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  Exception ( " No user message found " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-13 13:07:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                retrieval_app . state . config . RELEVANCE_THRESHOLD  ==  0 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-13 13:07:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                and  context_string . strip ( )  ==  " " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                log . debug ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    f " With a 0 relevancy threshold for RAG, the context cannot be empty " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-13 12:56:50 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            # Workaround for Ollama 2.0+ system prompt issue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # TODO: replace with add_or_update_system_message 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  model [ " owned_by " ]  ==  " ollama " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                body [ " messages " ]  =  prepend_to_first_user_message_content ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    rag_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        retrieval_app . state . config . RAG_TEMPLATE ,  context_string ,  prompt 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    body [ " messages " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                body [ " messages " ]  =  add_or_update_system_message ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    rag_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                        retrieval_app . state . config . RAG_TEMPLATE ,  context_string ,  prompt 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    body [ " messages " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # If there are citations, add them to the data_items 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  len ( citations )  >  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data_items . append ( { " citations " :  citations } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        modified_body_bytes  =  json . dumps ( body ) . encode ( " utf-8 " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Replace the request body with the modified one 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        request . _body  =  modified_body_bytes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Set custom header to ensure content-length matches new body length 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        request . headers . __dict__ [ " _list " ]  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( b " content-length " ,  str ( len ( modified_body_bytes ) ) . encode ( " utf-8 " ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * [ ( k ,  v )  for  k ,  v  in  request . headers . raw  if  k . lower ( )  !=  b " content-length " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-06 21:14:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 17:34:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  isinstance ( response ,  StreamingResponse ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  response 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 17:34:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        content_type  =  response . headers [ " Content-Type " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        is_openai  =  " text/event-stream "  in  content_type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        is_ollama  =  " application/x-ndjson "  in  content_type 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  not  is_openai  and  not  is_ollama : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  response 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 17:34:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        def  wrap_item ( item ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  f " data:  { item } \n \n "  if  is_openai  else  f " { item } \n " 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 17:34:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        async  def  stream_wrapper ( original_generator ,  data_items ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  item  in  data_items : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  wrap_item ( json . dumps ( item ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 17:06:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 17:34:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            async  for  data  in  original_generator : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  data 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-06 21:14:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-31 22:15:21 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  StreamingResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            stream_wrapper ( response . body_iterator ,  data_items ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            headers = dict ( response . headers ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 17:06:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-16 00:03:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    async  def  _receive ( self ,  body :  bytes ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { " type " :  " http.request " ,  " body " :  body ,  " more_body " :  False } 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-06 21:14:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . add_middleware ( ChatCompletionMiddleware )  
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-11 05:00:05 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Pipeline Middleware  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-09 14:34:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:51:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								def  get_sorted_filters ( model_id ) :  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    filters  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  model  in  app . state . MODELS . values ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " pipeline "  in  model 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        and  " type "  in  model [ " pipeline " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        and  model [ " pipeline " ] [ " type " ]  ==  " filter " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        and  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            model [ " pipeline " ] [ " pipelines " ]  ==  [ " * " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            or  any ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                model_id  ==  target_model_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  target_model_id  in  model [ " pipeline " ] [ " pipelines " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sorted_filters  =  sorted ( filters ,  key = lambda  x :  x [ " pipeline " ] [ " priority " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:51:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  sorted_filters 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  filter_pipeline ( payload ,  user ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user  =  { " id " :  user . id ,  " email " :  user . email ,  " name " :  user . name ,  " role " :  user . role } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  payload [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sorted_filters  =  get_sorted_filters ( model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  " pipeline "  in  model : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sorted_filters . append ( model ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  filter  in  sorted_filters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            urlIdx  =  filter [ " urlIdx " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 20:04:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  key  ==  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                continue 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r  =  requests . post ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                f " { url } / { filter [ ' id ' ] } /filter/inlet " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                headers = headers , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                json = { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " user " :  user , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " body " :  payload , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 20:04:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            payload  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  r  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:51:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:31:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    raise  Exception ( r . status_code ,  res [ " detail " ] ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  payload 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:03:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  PipelineMiddleware ( BaseHTTPMiddleware ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    async  def  dispatch ( self ,  request :  Request ,  call_next ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  is_chat_completion_request ( request ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  await  call_next ( request ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:31:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        log . debug ( f " request.url.path:  { request . url . path } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 17:04:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        # Read the original request body 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        body  =  await  request . body ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Decode body to string 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        body_str  =  body . decode ( " utf-8 " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Parse string to JSON 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  json . loads ( body_str )  if  body_str  else  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 02:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            user  =  get_current_user ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                request , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                get_http_authorization_cred ( request . headers [ " Authorization " ] ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  KeyError  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    status_code = status . HTTP_401_UNAUTHORIZED , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    content = { " detail " :  " Not authenticated " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            data  =  filter_pipeline ( data ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-10 19:03:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        modified_body_bytes  =  json . dumps ( data ) . encode ( " utf-8 " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Replace the request body with the modified one 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        request . _body  =  modified_body_bytes 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Set custom header to ensure content-length matches new body length 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        request . headers . __dict__ [ " _list " ]  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ( b " content-length " ,  str ( len ( modified_body_bytes ) ) . encode ( " utf-8 " ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            * [ ( k ,  v )  for  k ,  v  in  request . headers . raw  if  k . lower ( )  !=  b " content-length " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:03:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    async  def  _receive ( self ,  body :  bytes ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { " type " :  " http.request " ,  " body " :  body ,  " more_body " :  False } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . add_middleware ( PipelineMiddleware )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 09:19:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  urllib . parse  import  urlencode ,  parse_qs ,  urlparse  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  RedirectMiddleware ( BaseHTTPMiddleware ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    async  def  dispatch ( self ,  request :  Request ,  call_next ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Check if the request is a GET request 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  request . method  ==  " GET " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            path  =  request . url . path 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            query_params  =  dict ( parse_qs ( urlparse ( str ( request . url ) ) . query ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Check for the specific watch path and the presence of 'v' parameter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  path . endswith ( " /watch " )  and  " v "  in  query_params : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                video_id  =  query_params [ " v " ] [ 0 ]   # Extract the first 'v' parameter 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                encoded_video_id  =  urlencode ( { " youtube " :  video_id } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                redirect_url  =  f " /? { encoded_video_id } " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  RedirectResponse ( url = redirect_url ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Proceed with the normal flow of other requests 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Add the middleware to the app  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . add_middleware ( RedirectMiddleware )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 00:50:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . add_middleware (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    CORSMiddleware , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 05:17:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    allow_origins = CORS_ALLOW_ORIGIN , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 00:50:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    allow_credentials = True , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    allow_methods = [ " * " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    allow_headers = [ " * " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-17 08:53:30 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								app . add_middleware ( SecurityHeadersMiddleware )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 00:50:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:06:15 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.middleware ( " http " )  
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:45:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  commit_session_after_request ( request :  Request ,  call_next ) :  
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:06:15 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:45:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( " Commit session after request " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:06:15 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    Session . commit ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 00:50:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.middleware ( " http " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  check_url ( request :  Request ,  call_next ) :  
						 
					
						
							
								
									
										
										
										
											2024-05-25 09:26:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  len ( app . state . MODELS )  ==  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        await  get_all_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-11-15 08:28:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    start_time  =  int ( time . time ( ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    process_time  =  int ( time . time ( ) )  -  start_time 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response . headers [ " X-Process-Time " ]  =  str ( process_time ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  response 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-19 23:00:07 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.middleware ( " http " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  update_embedding_function ( request :  Request ,  call_next ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    response  =  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  " /embedding/update "  in  request . url . path : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        webui_app . state . EMBEDDING_FUNCTION  =  retrieval_app . state . EMBEDDING_FUNCTION 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-19 23:00:07 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  response 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 19:22:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-19 23:00:07 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-08 18:54:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								@app.middleware ( " http " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  inspect_websocket ( request :  Request ,  call_next ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " /ws/socket.io "  in  request . url . path 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        and  request . query_params . get ( " transport " )  ==  " websocket " 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-08 18:54:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        upgrade  =  ( request . headers . get ( " Upgrade " )  or  " " ) . lower ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        connection  =  ( request . headers . get ( " Connection " )  or  " " ) . lower ( ) . split ( " , " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Check that there's the correct headers for an upgrade, else reject the connection 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # This is to work around this upstream issue: https://github.com/miguelgrinberg/python-engineio/issues/367 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  upgrade  !=  " websocket "  or  " upgrade "  not  in  connection : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  " Invalid WebSocket upgrade request " } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  await  call_next ( request ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-04 14:39:52 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /ws " ,  socket_app )  
						 
					
						
							
								
									
										
										
										
											2024-03-04 11:55:32 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /ollama " ,  ollama_app )  
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /openai " ,  openai_app )  
						 
					
						
							
								
									
										
										
										
											2024-02-11 16:17:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 10:12:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /images/api/v1 " ,  images_app )  
						 
					
						
							
								
									
										
										
										
											2024-02-11 16:17:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /audio/api/v1 " ,  audio_app )  
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								app . mount ( " /retrieval/api/v1 " ,  retrieval_app )  
						 
					
						
							
								
									
										
										
										
											2024-01-07 14:07:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-19 23:00:07 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /api/v1 " ,  webui_app )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								webui_app . state . EMBEDDING_FUNCTION  =  retrieval_app . state . EMBEDDING_FUNCTION  
						 
					
						
							
								
									
										
										
										
											2024-05-19 23:00:07 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-01 04:59:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-25 09:26:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_all_models ( ) :  
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    # TODO: Optimize this function 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:14:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    open_webui_models  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    openai_models  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ollama_models  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  app . state . config . ENABLE_OPENAI_API : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        openai_models  =  await  get_openai_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        openai_models  =  openai_models [ " data " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  app . state . config . ENABLE_OLLAMA_API : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ollama_models  =  await  get_ollama_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ollama_models  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " id " :  model [ " model " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " name " :  model [ " name " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " object " :  " model " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " created " :  int ( time . time ( ) ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " owned_by " :  " ollama " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " ollama " :  model , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  model  in  ollama_models [ " models " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 03:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    open_webui_models  =  await  get_open_webui_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:14:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    models  =  open_webui_models  +  openai_models  +  ollama_models 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 03:04:45 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # If there are no models, return an empty list 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  len ( [ model  for  model  in  models  if  model [ " owned_by " ]  !=  " arena " ] )  ==  0 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    global_action_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function . id  for  function  in  Functions . get_global_action_functions ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enabled_action_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function . id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  function  in  Functions . get_functions_by_type ( " action " ,  active_only = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 19:21:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    custom_models  =  Models . get_all_models ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    for  custom_model  in  custom_models : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  custom_model . base_model_id  is  None : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            for  model  in  models : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 17:11:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    custom_model . id  ==  model [ " id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    or  custom_model . id  ==  model [ " id " ] . split ( " : " ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 17:11:17 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    model [ " name " ]  =  custom_model . name 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    model [ " info " ]  =  custom_model . model_dump ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:00:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    action_ids  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    if  " info "  in  model  and  " meta "  in  model [ " info " ] : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        action_ids . extend ( model [ " info " ] [ " meta " ] . get ( " actionIds " ,  [ ] ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:00:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    model [ " action_ids " ]  =  action_ids 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 18:06:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            owned_by  =  " openai " 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 04:41:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            pipe  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:00:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            action_ids  =  [ ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 04:41:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 18:06:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            for  model  in  models : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-25 11:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                if  ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    custom_model . base_model_id  ==  model [ " id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    or  custom_model . base_model_id  ==  model [ " id " ] . split ( " : " ) [ 0 ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-25 11:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 18:06:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    owned_by  =  model [ " owned_by " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 04:41:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    if  " pipe "  in  model : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        pipe  =  model [ " pipe " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 18:06:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    break 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-14 15:28:21 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            if  custom_model . meta : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                meta  =  custom_model . meta . model_dump ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " actionIds "  in  meta : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    action_ids . extend ( meta [ " actionIds " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            models . append ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " id " :  custom_model . id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " name " :  custom_model . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " object " :  " model " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " created " :  custom_model . created_at , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 18:06:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    " owned_by " :  owned_by , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    " info " :  custom_model . model_dump ( ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-25 11:29:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    " preset " :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-05 04:41:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    * * ( { " pipe " :  pipe }  if  pipe  is  not  None  else  { } ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-28 20:00:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    " action_ids " :  action_ids , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  model  in  models : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        action_ids  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  " action_ids "  in  model : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            action_ids  =  model [ " action_ids " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            del  model [ " action_ids " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        action_ids  =  action_ids  +  global_action_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        action_ids  =  list ( set ( action_ids ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        action_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            action_id  for  action_id  in  action_ids  if  action_id  in  enabled_action_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        model [ " actions " ]  =  [ ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  action_id  in  action_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            action  =  Functions . get_function_by_id ( action_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  action  is  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                raise  Exception ( f " Action not found:  { action_id } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  action_id  in  webui_app . state . FUNCTIONS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                function_module  =  webui_app . state . FUNCTIONS [ action_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                function_module ,  _ ,  _  =  load_function_module_by_id ( action_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                webui_app . state . FUNCTIONS [ action_id ]  =  function_module 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 23:28:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            __webui__  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  hasattr ( function_module ,  " __webui__ " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                __webui__  =  function_module . __webui__ 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  hasattr ( function_module ,  " actions " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                actions  =  function_module . actions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                model [ " actions " ] . extend ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " id " :  f " { action_id } . { _action [ ' id ' ] } " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " name " :  _action . get ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                " name " ,  f " { action . name }  ( { _action [ ' id ' ] } ) " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " description " :  action . meta . description , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " icon_url " :  _action . get ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                " icon_url " ,  action . meta . manifest . get ( " icon_url " ,  None ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 23:28:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                            * * ( { " __webui__ " :  __webui__ }  if  __webui__  else  { } ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        for  _action  in  actions 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                model [ " actions " ] . append ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " id " :  action_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " name " :  action . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " description " :  action . meta . description , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " icon_url " :  action . meta . manifest . get ( " icon_url " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 23:28:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        * * ( { " __webui__ " :  __webui__ }  if  __webui__  else  { } ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-25 09:26:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . state . MODELS  =  { model [ " id " ] :  model  for  model  in  models } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    webui_app . state . MODELS  =  app . state . MODELS 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  models 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/models " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_models ( user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    models  =  await  get_all_models ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:03:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:34:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    # Filter out filter pipelines 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:03:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    models  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  model  in  models 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 02:43:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  " pipeline "  not  in  model  or  model [ " pipeline " ] . get ( " type " ,  None )  !=  " filter " 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 10:03:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-24 16:40:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  app . state . config . ENABLE_MODEL_FILTER : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  user . role  ==  " user " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            models  =  list ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                filter ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    lambda  model :  model [ " id " ]  in  app . state . config . MODEL_FILTER_LIST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    models , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { " data " :  models } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { " data " :  models } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/chat/completions " )  
						 
					
						
							
								
									
										
										
										
											2024-10-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								async  def  generate_chat_completions (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    form_data :  dict ,  user = Depends ( get_verified_user ) ,  bypass_filter :  bool  =  False 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-26 20:24:56 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-26 20:24:56 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  bypass_filter  and  app . state . config . ENABLE_MODEL_FILTER : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-26 20:24:56 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  user . role  ==  " user "  and  model_id  not  in  app . state . config . MODEL_FILTER_LIST : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_403_FORBIDDEN , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ model_id ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model [ " owned_by " ]  ==  " arena " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        model_ids  =  model . get ( " info " ,  { } ) . get ( " meta " ,  { } ) . get ( " model_ids " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 03:40:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        filter_mode  =  model . get ( " info " ,  { } ) . get ( " meta " ,  { } ) . get ( " filter_mode " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  model_ids  and  filter_mode  ==  " exclude " : 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 03:40:47 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            model_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                model [ " id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  model  in  await  get_all_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  model . get ( " owned_by " )  !=  " arena " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                and  not  model . get ( " info " ,  { } ) . get ( " meta " ,  { } ) . get ( " hidden " ,  False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                and  model [ " id " ]  not  in  model_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        selected_model_id  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  isinstance ( model_ids ,  list )  and  model_ids : 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            selected_model_id  =  random . choice ( model_ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            model_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                model [ " id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  model  in  await  get_all_models ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  model . get ( " owned_by " )  !=  " arena " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                and  not  model . get ( " info " ,  { } ) . get ( " meta " ,  { } ) . get ( " hidden " ,  False ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            selected_model_id  =  random . choice ( model_ids ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-22 18:16:48 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        form_data [ " model " ]  =  selected_model_id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  form_data . get ( " stream " )  ==  True : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            async  def  stream_wrapper ( stream ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                yield  f " data:  { json . dumps ( { ' selected_model_id ' :  selected_model_id } ) } \n \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                async  for  chunk  in  stream : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    yield  chunk 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            response  =  await  generate_chat_completions ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                form_data ,  user ,  bypass_filter = True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return  StreamingResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                stream_wrapper ( response . body_iterator ) ,  media_type = " text/event-stream " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-24 06:05:43 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    await  generate_chat_completions ( form_data ,  user ,  bypass_filter = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-23 08:43:39 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                " selected_model_id " :  selected_model_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 04:43:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  model . get ( " pipe " ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-20 22:41:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  await  generate_function_chat_completion ( form_data ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  model [ " owned_by " ]  ==  " ollama " : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        # Using /ollama/api/chat endpoint 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data  =  convert_payload_openai_to_ollama ( form_data ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data  =  GenerateChatCompletionForm ( * * form_data ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-25 05:22:04 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        response  =  await  generate_ollama_chat_completion ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            form_data = form_data ,  user = user ,  bypass_filter = True 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  form_data . stream : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            response . headers [ " content-type " ]  =  " text/event-stream " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  StreamingResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                convert_streaming_response_ollama_to_openai ( response ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                headers = dict ( response . headers ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  convert_response_ollama_to_openai ( response ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  await  generate_openai_chat_completion ( form_data ,  user = user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/chat/completed " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  chat_completed ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    data  =  form_data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  data [ " model " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ model_id ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:51:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    sorted_filters  =  get_sorted_filters ( model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " pipeline "  in  model : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sorted_filters  =  [ model ]  +  sorted_filters 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  filter  in  sorted_filters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            urlIdx  =  filter [ " urlIdx " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  key  !=  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r  =  requests . post ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    f " { url } / { filter [ ' id ' ] } /filter/outlet " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    headers = headers , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    json = { 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-23 03:14:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        " user " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " id " :  user . id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " email " :  user . email , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            " role " :  user . role , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        " body " :  data , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            status_code = r . status_code , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            content = res , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 20:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 20:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    __event_emitter__  =  get_event_emitter ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 01:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " chat_id " :  data [ " chat_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " message_id " :  data [ " id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " session_id " :  data [ " session_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 12:41:44 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 20:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    __event_call__  =  get_event_call ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 01:40:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " chat_id " :  data [ " chat_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " message_id " :  data [ " id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " session_id " :  data [ " session_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 12:40:22 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    def  get_priority ( function_id ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function  =  Functions . get_function_by_id ( function_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  function  is  not  None  and  hasattr ( function ,  " valves " ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            # TODO: Fix FunctionModel to include vavles 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            return  ( function . valves  if  function . valves  else  { } ) . get ( " priority " ,  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 04:04:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    filter_ids  =  [ function . id  for  function  in  Functions . get_global_filter_functions ( ) ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 19:38:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " info "  in  model  and  " meta "  in  model [ " info " ] : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 04:04:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        filter_ids . extend ( model [ " info " ] [ " meta " ] . get ( " filterIds " ,  [ ] ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        filter_ids  =  list ( set ( filter_ids ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-28 04:04:12 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    enabled_filter_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function . id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  function  in  Functions . get_functions_by_type ( " filter " ,  active_only = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter_id  for  filter_id  in  filter_ids  if  filter_id  in  enabled_filter_ids 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    # Sort filter_ids by priority, using the get_priority function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    filter_ids . sort ( key = get_priority ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 10:18:13 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    for  filter_id  in  filter_ids : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        filter  =  Functions . get_function_by_id ( filter_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  filter : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  filter_id  in  webui_app . state . FUNCTIONS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module  =  webui_app . state . FUNCTIONS [ filter_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module ,  _ ,  _  =  load_function_module_by_id ( filter_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            webui_app . state . FUNCTIONS [ filter_id ]  =  function_module 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  hasattr ( function_module ,  " valves " )  and  hasattr ( function_module ,  " Valves " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            valves  =  Functions . get_function_valves_by_id ( filter_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            function_module . valves  =  function_module . Valves ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                * * ( valves  if  valves  else  { } ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-24 11:11:08 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  not  hasattr ( function_module ,  " outlet " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            continue 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            outlet  =  function_module . outlet 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Get the signature of the function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sig  =  inspect . signature ( outlet ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            params  =  { " body " :  data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Extra parameters to be passed to the function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            extra_params  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __model__ " :  model , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __id__ " :  filter_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __event_emitter__ " :  __event_emitter__ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __event_call__ " :  __event_call__ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Add extra params in contained in function signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  key ,  value  in  extra_params . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  key  in  sig . parameters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    params [ key ]  =  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  " __user__ "  in  sig . parameters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                __user__  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " id " :  user . id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " email " :  user . email , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " role " :  user . role , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  hasattr ( function_module ,  " UserValves " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        __user__ [ " valves " ]  =  function_module . UserValves ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            * * Functions . get_user_valves_by_id_and_user_id ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                filter_id ,  user . id 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    print ( e ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-21 11:26:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                params  =  { * * params ,  " __user__ " :  __user__ } 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 19:15:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  inspect . iscoroutinefunction ( outlet ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  await  outlet ( * * params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  outlet ( * * params ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 18:23:50 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/chat/actions/ {action_id} " )  
						 
					
						
							
								
									
										
										
										
											2024-08-02 23:45:30 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  chat_action ( action_id :  str ,  form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " . "  in  action_id : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        action_id ,  sub_action_id  =  action_id . split ( " . " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sub_action_id  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    action  =  Functions . get_function_by_id ( action_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  not  action : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Action not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 10:05:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    data  =  form_data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 20:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    __event_emitter__  =  get_event_emitter ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " chat_id " :  data [ " chat_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " message_id " :  data [ " id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " session_id " :  data [ " session_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-31 20:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    __event_call__  =  get_event_call ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " chat_id " :  data [ " chat_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " message_id " :  data [ " id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " session_id " :  data [ " session_id " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  action_id  in  webui_app . state . FUNCTIONS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function_module  =  webui_app . state . FUNCTIONS [ action_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function_module ,  _ ,  _  =  load_function_module_by_id ( action_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        webui_app . state . FUNCTIONS [ action_id ]  =  function_module 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  hasattr ( function_module ,  " valves " )  and  hasattr ( function_module ,  " Valves " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        valves  =  Functions . get_function_valves_by_id ( action_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        function_module . valves  =  function_module . Valves ( * * ( valves  if  valves  else  { } ) ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  hasattr ( function_module ,  " action " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            action  =  function_module . action 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Get the signature of the function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            sig  =  inspect . signature ( action ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            params  =  { " body " :  data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Extra parameters to be passed to the function 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            extra_params  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __model__ " :  model , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-29 05:02:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                " __id__ " :  sub_action_id  if  sub_action_id  is  not  None  else  action_id , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-12 09:41:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                " __event_emitter__ " :  __event_emitter__ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " __event_call__ " :  __event_call__ , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            # Add extra params in contained in function signature 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  key ,  value  in  extra_params . items ( ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  key  in  sig . parameters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    params [ key ]  =  value 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  " __user__ "  in  sig . parameters : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                __user__  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " id " :  user . id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " email " :  user . email , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " role " :  user . role , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    if  hasattr ( function_module ,  " UserValves " ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        __user__ [ " valves " ]  =  function_module . UserValves ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            * * Functions . get_user_valves_by_id_and_user_id ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                                action_id ,  user . id 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    print ( e ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                params  =  { * * params ,  " __user__ " :  __user__ } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  inspect . iscoroutinefunction ( action ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  await  action ( * * params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  action ( * * params ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            print ( f " Error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  data 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Task Endpoints  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# TODO: Refactor task API endpoints below into a separate file  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/task/config " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_task_config ( user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TASK_MODEL " :  app . state . config . TASK_MODEL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TASK_MODEL_EXTERNAL " :  app . state . config . TASK_MODEL_EXTERNAL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TITLE_GENERATION_PROMPT_TEMPLATE " :  app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " TAGS_GENERATION_PROMPT_TEMPLATE " :  app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " ENABLE_SEARCH_QUERY " :  app . state . config . ENABLE_SEARCH_QUERY , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE " :  app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " :  app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  TaskConfigForm ( BaseModel ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TASK_MODEL :  Optional [ str ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TASK_MODEL_EXTERNAL :  Optional [ str ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    TITLE_GENERATION_PROMPT_TEMPLATE :  str 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    TAGS_GENERATION_PROMPT_TEMPLATE :  str 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE :  str 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ENABLE_SEARCH_QUERY :  bool 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE :  str 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/config/update " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  update_task_config ( form_data :  TaskConfigForm ,  user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app . state . config . TASK_MODEL  =  form_data . TASK_MODEL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app . state . config . TASK_MODEL_EXTERNAL  =  form_data . TASK_MODEL_EXTERNAL 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data . TITLE_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data . TAGS_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    app . state . config . ENABLE_SEARCH_QUERY  =  form_data . ENABLE_SEARCH_QUERY 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE  =  ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TASK_MODEL " :  app . state . config . TASK_MODEL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TASK_MODEL_EXTERNAL " :  app . state . config . TASK_MODEL_EXTERNAL , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " TITLE_GENERATION_PROMPT_TEMPLATE " :  app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 12:27:10 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " TAGS_GENERATION_PROMPT_TEMPLATE " :  app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE " :  app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " ENABLE_SEARCH_QUERY " :  app . state . config . ENABLE_SEARCH_QUERY , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-11 14:40:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE " :  app . state . config . TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:26:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/title/completions " )  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  generate_title ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " generate_title " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If the user has a custom task model, use that model 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( task_model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ task_model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE  !=  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  app . state . config . TITLE_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:24:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        template  =  """ Create a concise, 3-5 word title with an emoji as a title for the chat history, in the given language. Suitable Emojis for the summary can be used to enhance understanding but avoid quotation marks or special formatting. RESPOND ONLY WITH THE TITLE TEXT. 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Examples  of  titles :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								📉  Stock  Market  Trends  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								🍪  Perfect  Chocolate  Chip  Recipe  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Evolution  of  Music  Streaming  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Remote  Work  Productivity  Tips  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Artificial  Intelligence  in  Healthcare  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								🎮  Video  Game  Development  Insights  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:24:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								< chat_history >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ { MESSAGES : END : 2 } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / chat_history > """ 
  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    content  =  title_generation_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-17 06:32:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        template , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 19:24:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        form_data [ " messages " ] , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-17 06:32:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " location " :  user . info . get ( " location " )  if  user . info  else  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ { " role " :  " user " ,  " content " :  content } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  False , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { " max_tokens " :  50 } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  app . state . MODELS [ task_model_id ] [ " owned_by " ]  ==  " ollama " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " max_completion_tokens " :  50 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " chat_id " :  form_data . get ( " chat_id " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-07 05:56:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " metadata " :  { " task " :  str ( TASKS . TITLE_GENERATION ) ,  " task_body " :  form_data } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 23:40:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( payload ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Handle pipeline filters 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " chat_id "  in  payload : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  payload [ " chat_id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 11:34:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/tags/completions " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  generate_chat_tags ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " generate_chat_tags " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If the user has a custom task model, use that model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( task_model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-20 16:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE  !=  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  app . state . config . TAGS_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  """ ### Task: 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Generate  1 - 3  broad  tags  categorizing  the  main  themes  of  the  chat  history ,  along  with  1 - 3  more  specific  subtopic  tags .  
						 
					
						
							
								
									
										
										
										
											2024-10-20 11:34:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								### Guidelines:  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  Start  with  high - level  domains  ( e . g .  Science ,  Technology ,  Philosophy ,  Arts ,  Politics ,  Business ,  Health ,  Sports ,  Entertainment ,  Education )  
						 
					
						
							
								
									
										
										
										
											2024-10-20 16:20:27 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								-  Consider  including  relevant  subfields / subdomains  if  they  are  strongly  represented  throughout  the  conversation  
						 
					
						
							
								
									
										
										
										
											2024-10-20 11:34:17 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								-  If  content  is  too  short  ( less  than  3  messages )  or  too  diverse ,  use  only  [ " General " ]  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  Use  the  chat ' s primary language; default to English if multilingual  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  Prioritize  accuracy  over  specificity  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								### Output:  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								JSON  format :  {  " tags " :  [ " tag1 " ,  " tag2 " ,  " tag3 " ]  }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								### Chat History:  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< chat_history >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{ { MESSAGES : END : 6 } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								< / chat_history > """ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    content  =  tags_generation_template ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template ,  form_data [ " messages " ] ,  { " name " :  user . name } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " content " ,  content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ { " role " :  " user " ,  " content " :  content } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  False , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " metadata " :  { " task " :  str ( TASKS . TAGS_GENERATION ) ,  " task_body " :  form_data } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 23:40:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( payload ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Handle pipeline filters 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " chat_id "  in  payload : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  payload [ " chat_id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:25:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/query/completions " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  generate_search_query ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " generate_search_query " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  not  app . state . config . ENABLE_SEARCH_QUERY : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 06:19:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            detail = f " Search query generation is disabled " , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 06:19:36 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If the user has a custom task model, use that model 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( task_model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ task_model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE  !=  " " : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template  =  app . state . config . SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    else : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-08 08:17:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        template  =  """ Given the user ' s message and interaction history, decide if a web search is necessary. You must be concise and exclusively provide a search query if one is necessary. Refrain from verbose responses or any additional commentary. Prefer suggesting a search if uncertain to provide comprehensive or updated information. If a search isn ' t needed at all, respond with an empty string. Default to a search query when in doubt. Today ' s date is  {{ CURRENT_DATE}}. 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-08 08:04:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								User  Message :  
						 
					
						
							
								
									
										
										
										
											2024-09-08 07:51:12 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{ { prompt : end : 4000 } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Interaction  History :  
						 
					
						
							
								
									
										
										
										
											2024-09-08 08:17:02 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{ { MESSAGES : END : 6 } }  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Search  Query : """ 
  
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    content  =  search_query_generation_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        template ,  form_data [ " messages " ] ,  { " name " :  user . name } 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-07 11:50:29 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    print ( " content " ,  content ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ { " role " :  " user " ,  " content " :  content } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  False , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { " max_tokens " :  30 } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  app . state . MODELS [ task_model_id ] [ " owned_by " ]  ==  " ollama " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " max_completion_tokens " :  30 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-07 05:56:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " metadata " :  { " task " :  str ( TASKS . QUERY_GENERATION ) ,  " task_body " :  form_data } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    log . debug ( payload ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Handle pipeline filters 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " chat_id "  in  payload : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  payload [ " chat_id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/emoji/completions " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  generate_emoji ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " generate_emoji " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If the user has a custom task model, use that model 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( task_model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ task_model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    template  =  ''' 
 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 17:29:56 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								Your  task  is  to  reflect  the  speaker ' s likely facial expression through a fitting emoji. Interpret emotions from the message and reflect their facial expression using fitting, diverse emojis (e.g., 😊, 😢, 😡, 😱).  
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Message :  """ {{ prompt}} """  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								''' 
  
						 
					
						
							
								
									
										
										
										
											2024-10-23 02:23:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    content  =  emoji_generation_template ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-17 06:32:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        template , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data [ " prompt " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " name " :  user . name , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " location " :  user . info . get ( " location " )  if  user . info  else  None , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ { " role " :  " user " ,  " content " :  content } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  False , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-19 23:19:31 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { " max_tokens " :  4 } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if  app . state . MODELS [ task_model_id ] [ " owned_by " ]  ==  " ollama " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " max_completion_tokens " :  4 , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 12:18:53 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " chat_id " :  form_data . get ( " chat_id " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-07 05:56:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " metadata " :  { " task " :  str ( TASKS . EMOJI_GENERATION ) ,  " task_body " :  form_data } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-16 23:40:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    log . debug ( payload ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # Handle pipeline filters 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-13 04:34:34 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-02 10:33:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " chat_id "  in  payload : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  payload [ " chat_id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-10 05:53:10 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/task/moa/completions " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  generate_moa_response ( form_data :  dict ,  user = Depends ( get_verified_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " generate_moa_response " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    model_id  =  form_data [ " model " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  model_id  not  in  app . state . MODELS : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_404_NOT_FOUND , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Model not found " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the user has a custom task model 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # If the user has a custom task model, use that model 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 05:48:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    task_model_id  =  get_task_model_id ( model_id ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( task_model_id ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 06:30:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    model  =  app . state . MODELS [ task_model_id ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    template  =  """ You have been provided with a set of responses from various models to the latest user query:  " {{ prompt}} " 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Your  task  is  to  synthesize  these  responses  into  a  single ,  high - quality  response .  It  is  crucial  to  critically  evaluate  the  information  provided  in  these  responses ,  recognizing  that  some  of  it  may  be  biased  or  incorrect .  Your  response  should  not  simply  replicate  the  given  answers  but  should  offer  a  refined ,  accurate ,  and  comprehensive  reply  to  the  instruction .  Ensure  your  response  is  well - structured ,  coherent ,  and  adheres  to  the  highest  standards  of  accuracy  and  reliability .  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Responses  from  models :  { { responses } } """ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    content  =  moa_response_generation_template ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        template , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data [ " prompt " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        form_data [ " responses " ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    payload  =  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 05:48:03 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " model " :  task_model_id , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " messages " :  [ { " role " :  " user " ,  " content " :  content } ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " stream " :  form_data . get ( " stream " ,  False ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " chat_id " :  form_data . get ( " chat_id " ,  None ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-07 05:56:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " metadata " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " task " :  str ( TASKS . MOA_RESPONSE_GENERATION ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " task_body " :  form_data , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    log . debug ( payload ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        payload  =  filter_pipeline ( payload ,  user ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-04 23:52:59 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if  len ( e . args )  >  1 : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = e . args [ 0 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  e . args [ 1 ] } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        else : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return  JSONResponse ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                content = { " detail " :  str ( e ) } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  " chat_id "  in  payload : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        del  payload [ " chat_id " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-21 08:03:58 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  generate_chat_completions ( form_data = payload ,  user = user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 02:59:59 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Pipelines Endpoints  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
									
										
										
										
											2024-05-30 17:04:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# TODO: Refactor pipelines API endpoints below into a separate file  
						 
					
						
							
								
									
										
										
										
											2024-05-30 17:04:29 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 12:26:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/pipelines/list " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_pipelines_list ( user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
									
										
										
										
											2024-08-04 23:42:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    responses  =  await  get_openai_models ( raw = True ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:41:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( responses ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-03 07:46:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    urlIdxs  =  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        idx 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  idx ,  response  in  enumerate ( responses ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  response  is  not  None  and  " pipelines "  in  response 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-03 07:46:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 12:26:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " data " :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " url " :  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " idx " :  urlIdx , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            for  urlIdx  in  urlIdxs 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/pipelines/upload " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  upload_pipeline (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    urlIdx :  int  =  Form ( . . . ) ,  file :  UploadFile  =  File ( . . . ) ,  user = Depends ( get_admin_user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( " upload_pipeline " ,  urlIdx ,  file . filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # Check if the uploaded file is a python file 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-11 15:31:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    if  not  ( file . filename  and  file . filename . endswith ( " .py " ) ) : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = status . HTTP_400_BAD_REQUEST , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = " Only Python (.py) files are allowed. " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    upload_folder  =  f " { CACHE_DIR } /pipelines " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    os . makedirs ( upload_folder ,  exist_ok = True ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    file_path  =  os . path . join ( upload_folder ,  file . filename ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Save the uploaded file 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        with  open ( file_path ,  " wb " )  as  buffer : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            shutil . copyfileobj ( file . file ,  buffer ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        with  open ( file_path ,  " rb " )  as  f : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            files  =  { " file " :  f } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            r  =  requests . post ( f " { url } /pipelines/upload " ,  headers = headers ,  files = files ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        status_code  =  status . HTTP_404_NOT_FOUND 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            status_code  =  r . status_code 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 18:51:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            status_code = status_code , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 04:57:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    finally : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Ensure the file is deleted after the upload is completed or on failure 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  os . path . exists ( file_path ) : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            os . remove ( file_path ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:03:22 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								class  AddPipelineForm ( BaseModel ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    url :  str 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    urlIdx :  int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/pipelines/add " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  add_pipeline ( form_data :  AddPipelineForm ,  user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        urlIdx  =  form_data . urlIdx 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . post ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f " { url } /pipelines/add " ,  headers = headers ,  json = { " url " :  form_data . url } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:03:22 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  DeletePipelineForm ( BaseModel ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    id :  str 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    urlIdx :  int 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.delete ( " /api/pipelines/delete " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  delete_pipeline ( form_data :  DeletePipelineForm ,  user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        urlIdx  =  form_data . urlIdx 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . delete ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f " { url } /pipelines/delete " ,  headers = headers ,  json = { " id " :  form_data . id } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:03:22 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:04:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/pipelines " )  
						 
					
						
							
								
									
										
										
										
											2024-05-30 12:26:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_pipelines ( urlIdx :  Optional [ int ]  =  None ,  user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 12:26:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . get ( f " { url } /pipelines " ,  headers = headers ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 12:26:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:04:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:04:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/pipelines/ {pipeline_id} /valves " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_pipeline_valves (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    urlIdx :  Optional [ int ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pipeline_id :  str , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user = Depends ( get_admin_user ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . get ( f " { url } / { pipeline_id } /valves " ,  headers = headers ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 04:05:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 04:05:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-14 20:38:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/pipelines/ {pipeline_id} /valves/spec " )  
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_pipeline_valves_spec (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    urlIdx :  Optional [ int ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pipeline_id :  str , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user = Depends ( get_admin_user ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . get ( f " { url } / { pipeline_id } /valves/spec " ,  headers = headers ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 04:05:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/pipelines/ {pipeline_id} /valves/update " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  update_pipeline_valves (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    urlIdx :  Optional [ int ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pipeline_id :  str , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    form_data :  dict , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user = Depends ( get_admin_user ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    r  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        url  =  openai_app . state . config . OPENAI_API_BASE_URLS [ urlIdx ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        key  =  openai_app . state . config . OPENAI_API_KEYS [ urlIdx ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        headers  =  { " Authorization " :  f " Bearer  { key } " } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        r  =  requests . post ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f " { url } / { pipeline_id } /valves/update " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            headers = headers , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            json = { * * form_data } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        r . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  r . json ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        return  { * * data } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        # Handle connection error here 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        print ( f " Connection error:  { e } " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        detail  =  " Pipeline not found " 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 04:05:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        if  r  is  not  None : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            try : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                res  =  r . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  " detail "  in  res : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    detail  =  res [ " detail " ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            except  Exception : 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                pass 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 04:05:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        raise  HTTPException ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:41:51 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            status_code = ( r . status_code  if  r  is  not  None  else  status . HTTP_404_NOT_FOUND ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-30 13:18:27 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            detail = detail , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-29 03:32:49 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# Config Endpoints  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								##################################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 10:12:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/config " )  
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_app_config ( request :  Request ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    user  =  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  " token "  in  request . cookies : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        token  =  request . cookies . get ( " token " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        data  =  decode_token ( token ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if  data  is  not  None  and  " id "  in  data : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            user  =  Users . get_user_by_id ( data [ " id " ] ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 10:12:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " status " :  True , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-24 09:12:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " name " :  WEBUI_NAME , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-23 16:30:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " version " :  VERSION , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-01 05:48:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " default_locale " :  str ( DEFAULT_LOCALE ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " oauth " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " providers " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                name :  config . get ( " name " ,  name ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                for  name ,  config  in  OAUTH_PROVIDERS . items ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-27 04:02:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " features " :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-27 00:05:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " auth " :  WEBUI_AUTH , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            " auth_trusted_header " :  bool ( webui_app . state . AUTH_TRUSTED_EMAIL_HEADER ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-27 04:02:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " enable_signup " :  webui_app . state . config . ENABLE_SIGNUP , 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-25 09:44:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            " enable_login_form " :  webui_app . state . config . ENABLE_LOGIN_FORM , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    " enable_web_search " :  retrieval_app . state . config . ENABLE_RAG_WEB_SEARCH , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    " enable_image_generation " :  images_app . state . config . ENABLED , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " enable_community_sharing " :  webui_app . state . config . ENABLE_COMMUNITY_SHARING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " enable_message_rating " :  webui_app . state . config . ENABLE_MESSAGE_RATING , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " enable_admin_export " :  ENABLE_ADMIN_EXPORT , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " enable_admin_chat_access " :  ENABLE_ADMIN_CHAT_ACCESS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                if  user  is  not  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                else  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-08 11:18:48 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        * * ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " default_models " :  webui_app . state . config . DEFAULT_MODELS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " default_prompt_suggestions " :  webui_app . state . config . DEFAULT_PROMPT_SUGGESTIONS , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " audio " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " tts " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " engine " :  audio_app . state . config . TTS_ENGINE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " voice " :  audio_app . state . config . TTS_VOICE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-25 08:35:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                        " split_on " :  audio_app . state . config . TTS_SPLIT_ON , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " stt " :  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                        " engine " :  audio_app . state . config . STT_ENGINE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 23:05:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                " file " :  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-28 07:27:46 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                    " max_size " :  retrieval_app . state . config . FILE_MAX_SIZE , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                    " max_count " :  retrieval_app . state . config . FILE_MAX_COUNT , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-27 23:05:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								                " permissions " :  { * * webui_app . state . config . USER_PERMISSIONS } , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-26 15:37:09 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            } 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-19 22:49:40 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            if  user  is  not  None 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            else  { } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) , 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-22 10:12:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/config/model/filter " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_model_filter_config ( user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " enabled " :  app . state . config . ENABLE_MODEL_FILTER , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " models " :  app . state . config . MODEL_FILTER_LIST , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  ModelFilterConfigForm ( BaseModel ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    enabled :  bool 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-14 20:46:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    models :  list [ str ] 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/config/model/filter " )  
						 
					
						
							
								
									
										
										
										
											2024-03-21 09:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  update_model_filter_config (  
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    form_data :  ModelFilterConfigForm ,  user = Depends ( get_admin_user ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								) :  
						 
					
						
							
								
									
										
										
										
											2024-05-18 01:35:33 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . state . config . ENABLE_MODEL_FILTER  =  form_data . enabled 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app . state . config . MODEL_FILTER_LIST  =  form_data . models 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " enabled " :  app . state . config . ENABLE_MODEL_FILTER , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " models " :  app . state . config . MODEL_FILTER_LIST , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:47:01 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-10 13:19:20 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-20 16:51:39 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# TODO: webhook endpoint should be under config endpoints  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 09:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/webhook " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_webhook_url ( user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " url " :  app . state . config . WEBHOOK_URL , 
							 
						 
					
						
							
								
									
										
										
										
											2024-03-21 09:35:02 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								class  UrlForm ( BaseModel ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    url :  str 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.post ( " /api/webhook " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  update_webhook_url ( form_data :  UrlForm ,  user = Depends ( get_admin_user ) ) :  
						 
					
						
							
								
									
										
										
										
											2024-05-10 15:03:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . state . config . WEBHOOK_URL  =  form_data . url 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    webui_app . state . WEBHOOK_URL  =  app . state . config . WEBHOOK_URL 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-04 12:17:43 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { " url " :  app . state . config . WEBHOOK_URL } 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-27 00:23:24 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-03-05 16:59:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/version " )  
						 
					
						
							
								
									
										
										
										
											2024-08-03 21:24:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  get_app_version ( ) :  
						 
					
						
							
								
									
										
										
										
											2024-03-05 16:59:35 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " version " :  VERSION , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-23 16:30:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/changelog " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_app_changelog ( ) :  
						 
					
						
							
								
									
										
										
										
											2024-03-31 16:10:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { key :  CHANGELOG [ key ]  for  idx ,  key  in  enumerate ( CHANGELOG )  if  idx  <  5 } 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-23 16:30:26 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-02-26 03:26:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /api/version/updates " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_app_latest_release_version ( ) :  
						 
					
						
							
								
									
										
										
										
											2024-10-08 13:13:49 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  OFFLINE_MODE : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            f " Offline mode is enabled, returning current version as latest version " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        return  { " current " :  VERSION ,  " latest " :  VERSION } 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-26 03:26:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    try : 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-27 20:38:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        timeout  =  aiohttp . ClientTimeout ( total = 1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        async  with  aiohttp . ClientSession ( timeout = timeout ,  trust_env = True )  as  session : 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-10 14:03:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            async  with  session . get ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-10-21 09:38:06 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                " https://api.github.com/repos/open-webui/open-webui/releases/latest " 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-10 14:03:05 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								            )  as  response : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                response . raise_for_status ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                data  =  await  response . json ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                latest_version  =  data [ " tag_name " ] 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                return  { " current " :  VERSION ,  " latest " :  latest_version [ 1 : ] } 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-30 22:32:38 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    except  Exception  as  e : 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        log . debug ( e ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-27 20:38:56 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        return  { " current " :  VERSION ,  " latest " :  VERSION } 
							 
						 
					
						
							
								
									
										
										
										
											2024-02-26 03:26:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-10 16:27:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								############################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# OAuth Login & Callback  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								############################  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# SessionMiddleware is used by authlib for oauth  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  len ( OAUTH_PROVIDERS )  >  0 :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    app . add_middleware ( 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-06 02:21:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        SessionMiddleware , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        secret_key = WEBUI_SECRET_KEY , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        session_cookie = " oui-session " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        same_site = WEBUI_SESSION_COOKIE_SAME_SITE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-07 16:13:42 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        https_only = WEBUI_SESSION_COOKIE_SECURE , 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								@app.get ( " /oauth/ {provider} /login " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  oauth_login ( provider :  str ,  request :  Request ) :  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:32:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  oauth_manager . handle_login ( provider ,  request ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-22 01:25:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# OAuth login logic is as follows:  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 1. Attempt to find a user with matching subject ID, tied to the provider  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 2. If OAUTH_MERGE_ACCOUNTS_BY_EMAIL is true, find a user with the email address provided via OAuth  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#    - This is considered insecure in general, as OAuth providers do not always verify email addresses  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# 3. If there is no user, and ENABLE_OAUTH_SIGNUP is true, create a user  
						 
					
						
							
								
									
										
										
										
											2024-10-14 15:13:26 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								#    - Email addresses are considered unique, so we fail registration if the email address is already taken  
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /oauth/ {provider} /callback " )  
						 
					
						
							
								
									
										
										
										
											2024-06-21 21:35:11 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  oauth_callback ( provider :  str ,  request :  Request ,  response :  Response ) :  
						 
					
						
							
								
									
										
										
										
											2024-10-16 22:32:57 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return  await  oauth_manager . handle_callback ( provider ,  request ,  response ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-28 01:07:38 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 02:55:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /manifest.json " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_manifest_json ( ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-04 11:43:55 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " name " :  WEBUI_NAME , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " short_name " :  WEBUI_NAME , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-24 19:28:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " description " :  " Open WebUI is an open, extensible, user-friendly interface for AI that adapts to your workflow. " , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 02:55:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " start_url " :  " / " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " display " :  " standalone " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " background_color " :  " #343541 " , 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-24 19:28:00 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        " orientation " :  " any " , 
							 
						 
					
						
							
								
									
										
										
										
											2024-08-15 19:24:47 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								        " icons " :  [ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " src " :  " /static/logo.png " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " type " :  " image/png " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " sizes " :  " 500x500 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " purpose " :  " any " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " src " :  " /static/logo.png " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " type " :  " image/png " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " sizes " :  " 500x500 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                " purpose " :  " maskable " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        ] , 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-03 02:55:00 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-10 16:27:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-07 08:29:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /opensearch.xml " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  get_opensearch_xml ( ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    xml_content  =  rf """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < OpenSearchDescription  xmlns = " http://a9.com/-/spec/opensearch/1.1/ "  xmlns : moz = " http://www.mozilla.org/2006/browser/search/ " > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < ShortName > { WEBUI_NAME } < / ShortName > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < Description > Search  { WEBUI_NAME } < / Description > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < InputEncoding > UTF - 8 < / InputEncoding > 
							 
						 
					
						
							
								
									
										
										
										
											2024-07-09 14:07:23 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    < Image  width = " 16 "  height = " 16 "  type = " image/x-icon " > { WEBUI_URL } / static / favicon . png < / Image > 
							 
						 
					
						
							
								
									
										
										
										
											2024-05-07 08:29:16 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    < Url  type = " text/html "  method = " get "  template = " {WEBUI_URL} /?q= { " { searchTerms } " } " / > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < moz : SearchForm > { WEBUI_URL } < / moz : SearchForm > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < / OpenSearchDescription > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    """ 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  Response ( content = xml_content ,  media_type = " application/xml " ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-05-16 02:17:18 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /health " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								async  def  healthcheck ( ) :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return  { " status " :  True } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-06-18 21:03:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								@app.get ( " /health/db " )  
						 
					
						
							
								
									
										
										
										
											2024-06-21 20:58:57 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								async  def  healthcheck_with_db ( ) :  
						 
					
						
							
								
									
										
										
										
											2024-06-24 19:06:15 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    Session . execute ( text ( " SELECT 1; " ) ) . all ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-06-18 21:03:31 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    return  { " status " :  True } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-09 18:32:28 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								app . mount ( " /static " ,  StaticFiles ( directory = STATIC_DIR ) ,  name = " static " )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								app . mount ( " /cache " ,  StaticFiles ( directory = CACHE_DIR ) ,  name = " cache " )  
						 
					
						
							
								
									
										
										
										
											2024-02-24 09:12:19 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-10-08 09:19:13 +08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-04-28 23:03:30 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								if  os . path . exists ( FRONTEND_BUILD_DIR ) :  
						 
					
						
							
								
									
										
										
										
											2024-05-22 12:38:58 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    mimetypes . add_type ( " text/javascript " ,  " .js " ) 
							 
						 
					
						
							
								
									
										
										
										
											2024-04-28 23:03:30 +08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    app . mount ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        " / " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        SPAStaticFiles ( directory = FRONTEND_BUILD_DIR ,  html = True ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        name = " spa-static-files " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								else :  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    log . warning ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        f " Frontend build directory not found at  ' { FRONTEND_BUILD_DIR } ' . Serving API only. " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    )