update
This commit is contained in:
96
backend/services/ollama_service.py
Normal file
96
backend/services/ollama_service.py
Normal file
@@ -0,0 +1,96 @@
|
||||
import requests
|
||||
from config import Config
|
||||
|
||||
|
||||
def list_ollama_models():
|
||||
"""List available models on Ollama server"""
|
||||
if not Config.OLLAMA_ENABLED:
|
||||
return None, "Ollama is not enabled"
|
||||
|
||||
try:
|
||||
url = f"{Config.OLLAMA_BASE_URL}/api/tags"
|
||||
headers = {}
|
||||
if Config.OLLAMA_API_KEY:
|
||||
headers["Authorization"] = f"Bearer {Config.OLLAMA_API_KEY}"
|
||||
|
||||
response = requests.get(url, headers=headers, timeout=10)
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
models = result.get('models', [])
|
||||
model_names = [model.get('name', '') for model in models]
|
||||
|
||||
return model_names, None
|
||||
except requests.exceptions.RequestException as e:
|
||||
return None, f"Error listing models: {str(e)}"
|
||||
except Exception as e:
|
||||
return None, f"Unexpected error: {str(e)}"
|
||||
|
||||
|
||||
def call_ollama(prompt, system_prompt=None):
|
||||
"""Call Ollama API to generate text"""
|
||||
if not Config.OLLAMA_ENABLED:
|
||||
return None, "Ollama is not enabled"
|
||||
|
||||
try:
|
||||
url = f"{Config.OLLAMA_BASE_URL}/api/generate"
|
||||
payload = {
|
||||
"model": Config.OLLAMA_MODEL,
|
||||
"prompt": prompt,
|
||||
"stream": False
|
||||
}
|
||||
|
||||
if system_prompt:
|
||||
payload["system"] = system_prompt
|
||||
|
||||
headers = {}
|
||||
if Config.OLLAMA_API_KEY:
|
||||
headers["Authorization"] = f"Bearer {Config.OLLAMA_API_KEY}"
|
||||
|
||||
print(f"Calling Ollama at {url} with model {Config.OLLAMA_MODEL}")
|
||||
response = requests.post(url, json=payload, headers=headers, timeout=30)
|
||||
response.raise_for_status()
|
||||
|
||||
result = response.json()
|
||||
response_text = result.get('response', '').strip()
|
||||
|
||||
if not response_text:
|
||||
return None, "Ollama returned empty response"
|
||||
|
||||
return response_text, None
|
||||
except requests.exceptions.ConnectionError as e:
|
||||
error_msg = f"Cannot connect to Ollama server at {Config.OLLAMA_BASE_URL}. Is Ollama running?"
|
||||
print(f"Connection error: {error_msg}")
|
||||
return None, error_msg
|
||||
except requests.exceptions.Timeout:
|
||||
error_msg = "Request to Ollama timed out after 30 seconds"
|
||||
print(f"Timeout error: {error_msg}")
|
||||
return None, error_msg
|
||||
except requests.exceptions.HTTPError as e:
|
||||
# Check if it's a model not found error
|
||||
if e.response.status_code == 404:
|
||||
try:
|
||||
error_data = e.response.json()
|
||||
if 'model' in error_data.get('error', '').lower() and 'not found' in error_data.get('error', '').lower():
|
||||
# Try to get available models
|
||||
available_models, _ = list_ollama_models()
|
||||
if available_models:
|
||||
error_msg = f"Model '{Config.OLLAMA_MODEL}' not found. Available models: {', '.join(available_models)}"
|
||||
else:
|
||||
error_msg = f"Model '{Config.OLLAMA_MODEL}' not found. Use 'ollama list' on the server to see available models."
|
||||
else:
|
||||
error_msg = f"HTTP error from Ollama: {e.response.status_code} - {e.response.text}"
|
||||
except (ValueError, KeyError):
|
||||
error_msg = f"HTTP error from Ollama: {e.response.status_code} - {e.response.text}"
|
||||
else:
|
||||
error_msg = f"HTTP error from Ollama: {e.response.status_code} - {e.response.text}"
|
||||
print(f"HTTP error: {error_msg}")
|
||||
return None, error_msg
|
||||
except requests.exceptions.RequestException as e:
|
||||
error_msg = f"Request error: {str(e)}"
|
||||
print(f"Request error: {error_msg}")
|
||||
return None, error_msg
|
||||
except Exception as e:
|
||||
error_msg = f"Unexpected error: {str(e)}"
|
||||
print(f"Unexpected error: {error_msg}")
|
||||
return None, error_msg
|
||||
Reference in New Issue
Block a user