From 7c61e9834033a2aecfc3d3fce9f6073c7ff1819c Mon Sep 17 00:00:00 2001 From: Iyeoluwa Akinrinola Date: Mon, 12 May 2025 16:10:45 +0100 Subject: [PATCH] Fix issues --- .DS_Store | Bin 0 -> 8196 bytes ai_service/api.py | 52 +++++++++++++++++++++++++- ai_service/config.py | 2 +- ai_service/models/model_service.py | 33 ++++++++++++++++ ai_service/openwebui_api.py | 58 ++++++++++++++++++----------- 5 files changed, 122 insertions(+), 23 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..03d3bde6e7486ec7528d5a5cb3c379364d2c1e62 GIT binary patch literal 8196 zcmeHM-A)rh6g~q5wlj6=YhzwMg*$kS5!sA@W z%2agcHlzTas7+luC7YV)>7p6X3}^;41DXNNz`w`<-q~D?3Ge-IRJWP|&A^ppfS(U0 zD$8Od2ceXY4m9!z0GYyVSyk^7k8W`s-wSk)d zDGPcNFpa+7i7?+99mn>A)z$A}YC1JDJ7>%p8RKpB$m>^wdeHMr_3mrFs(GH%xa`*( zFYR{U$}VntZcw+~c2@%IRvRjB_HDQ2^-EsQZTS*g4F`<0k+!nA^Yce*g%z`~Ubt8> z&mR|7SIo7C>lYVkW9jbwCwtbhbK-iREBetett3#c*mf$EMy~=HvTr?WdplnOM0r%Q`*CI4c9xk zlaL$9x@zerqU(Tn7nyBS12OY1Ys#1p&_7JH0tUrLB@;K`Z&${uw~htB|47QELHQynw%lV*YS6kop!iaif8I1*b=#B!$8xy%f){s_;U6IC;X@6Nm? zPDk{ZO;rz%6 Optional[Dict[str, Any]]: @@ -106,8 +122,17 @@ class ModelService: Returns: Generated response. """ + # Debug configuration information + print(f"ModelService configuration:") + print(f" - Ollama API URL: {self.ollama_api_url}") + print(f" - OpenWebUI URL: {self.openwebui_url}") + print(f" - Default model: {self.default_model}") + print(f" - Requested model: {model_id}") + print(f" - Using RAG: {use_rag}") + if model_id not in self.AVAILABLE_MODELS: model_id = self.default_model + print(f" - Model not found, using default: {model_id}") # Ensure we're using a valid model # (model_id is already validated above) @@ -158,6 +183,11 @@ class ModelService: if self.openwebui_api_key: headers["Authorization"] = f"Bearer {self.openwebui_api_key}" + # Debug logs + print(f"Sending RAG request to OpenWebUI at: {self.openwebui_url}/api/chat/completions") + print(f"OpenWebUI request: {json.dumps(openwebui_request, indent=2)}") + print(f"Headers: {headers}") + # OpenWebUI API endpoint is /api/chat/completions response = requests.post( f"{self.openwebui_url}/api/chat/completions", @@ -213,6 +243,9 @@ class ModelService: headers = {"Content-Type": "application/json"} # Direct Ollama API call + print(f"Sending request to Ollama API at: {self.ollama_api_url}/api/chat") + print(f"Request JSON: {json.dumps(request_json, indent=2)}") + response = requests.post( f"{self.ollama_api_url}/api/chat", headers={"Content-Type": "application/json"}, diff --git a/ai_service/openwebui_api.py b/ai_service/openwebui_api.py index 3b5801e..6cdeaed 100644 --- a/ai_service/openwebui_api.py +++ b/ai_service/openwebui_api.py @@ -23,7 +23,7 @@ async def get_models(): Get available models in OpenWebUI-compatible format. """ models = model_service.get_available_models() - + # Convert to OpenWebUI format openwebui_models = [] for model in models: @@ -36,7 +36,23 @@ async def get_models(): "root": model["id"], "parent": None }) - + + # Debug log + print(f"OpenWebUI models: {json.dumps(openwebui_models, indent=2)}") + + # Ensure we're returning a properly formatted list + if not openwebui_models: + # Return at least one default model if none are found + return [{ + "id": "llama3.1", + "object": "model", + "created": int(time.time()), + "owned_by": "user", + "permission": [], + "root": "llama3.1", + "parent": None + }] + return openwebui_models # Chat completions endpoint (OpenAI-compatible) @@ -47,7 +63,7 @@ async def chat_completions(request: Request): """ # Parse request body body = await request.json() - + # Extract parameters model_id = body.get("model", "llama3.1") messages = body.get("messages", []) @@ -58,26 +74,26 @@ async def chat_completions(request: Request): frequency_penalty = body.get("frequency_penalty") presence_penalty = body.get("presence_penalty") stop = body.get("stop") - + # Create a unique chat ID chat_id = str(uuid.uuid4()) - + # Create a user ID (in a real implementation, this would come from authentication) user_id = "openwebui-user" - + # Create a new chat chat_service.create_chat(user_id=user_id, title="API Chat", model_id=model_id) - + # Extract the user's message (last user message in the array) user_message = None for msg in reversed(messages): if msg.get("role") == "user": user_message = msg.get("content") break - + if not user_message: raise HTTPException(status_code=400, detail="No user message found") - + # Get chat response response = chat_service.get_chat_response( chat_id=chat_id, @@ -90,10 +106,10 @@ async def chat_completions(request: Request): presence_penalty=presence_penalty, stop_sequences=stop if isinstance(stop, list) else [stop] if stop else None ) - + # Format response in OpenAI-compatible format completion_id = f"chatcmpl-{str(uuid.uuid4())[:8]}" - + openai_response = { "id": completion_id, "object": "chat.completion", @@ -115,16 +131,16 @@ async def chat_completions(request: Request): "total_tokens": -1 } } - + # Handle streaming if requested if stream: async def generate_stream(): # Yield the response in the SSE format yield f"data: {json.dumps(openai_response)}\n\n" yield "data: [DONE]\n\n" - + return StreamingResponse(generate_stream(), media_type="text/event-stream") - + return openai_response # Health check endpoint @@ -143,27 +159,27 @@ async def ollama_generate(request: Request): """ # Parse request body body = await request.json() - + # Extract parameters model_id = body.get("model", "llama3.1") prompt = body.get("prompt", "") - + # Create a unique chat ID chat_id = str(uuid.uuid4()) - + # Create a user ID (in a real implementation, this would come from authentication) user_id = "openwebui-user" - + # Create a new chat chat_service.create_chat(user_id=user_id, title="API Chat", model_id=model_id) - + # Get chat response response = chat_service.get_chat_response( chat_id=chat_id, message=prompt, user_id=user_id ) - + # Format response in Ollama-compatible format ollama_response = { "model": model_id, @@ -171,5 +187,5 @@ async def ollama_generate(request: Request): "response": response.get("content", ""), "done": True } - + return ollama_response