import os import requests from journal.ai.api_compat import ( build_text_payload, detect_text_endpoint_kind, extract_text_response, normalize_endpoint_url, ) from journal.core.config import ( CLOUDAI_API_KEY, CLOUDAI_API_URL, CLOUDAI_CONNECT_TIMEOUT, CLOUDAI_TIMEOUT, LLAMA_CPP_MODEL, LLAMA_CPP_URL, ) def get_cloud_ai_response(prompt: str) -> str: """ Gets a response from the configured AI endpoint. Supports: - OpenAI-compatible chat/completions and responses APIs - LM Studio native /api/v1/chat - Legacy prompt APIs returning {"response": ...} """ api_key = os.getenv("JOURNAL_CLOUDAI_API_KEY", CLOUDAI_API_KEY).strip() raw_api_url = ( os.getenv("JOURNAL_CLOUDAI_API_URL", CLOUDAI_API_URL).strip() or os.getenv("JOURNAL_LLAMA_CPP_URL", "").strip() or LLAMA_CPP_URL ) api_url = normalize_endpoint_url(raw_api_url, "/v1/chat/completions") model = ( os.getenv("JOURNAL_CLOUDAI_MODEL", "").strip() or os.getenv("JOURNAL_LLAMA_CPP_MODEL", "").strip() or LLAMA_CPP_MODEL ) timeout_raw = os.getenv("JOURNAL_CLOUDAI_TIMEOUT", str(CLOUDAI_TIMEOUT)).strip() try: timeout_seconds = int(timeout_raw) except ValueError: timeout_seconds = CLOUDAI_TIMEOUT if timeout_seconds <= 0: timeout_seconds = CLOUDAI_TIMEOUT connect_timeout_raw = os.getenv( "JOURNAL_CLOUDAI_CONNECT_TIMEOUT", str(CLOUDAI_CONNECT_TIMEOUT) ).strip() try: connect_timeout_seconds = int(connect_timeout_raw) except ValueError: connect_timeout_seconds = CLOUDAI_CONNECT_TIMEOUT if connect_timeout_seconds <= 0: connect_timeout_seconds = CLOUDAI_CONNECT_TIMEOUT headers = {"Content-Type": "application/json"} if api_key: headers["Authorization"] = f"Bearer {api_key}" endpoint_kind = detect_text_endpoint_kind(api_url) payload = build_text_payload(prompt, model, endpoint_kind) try: response = requests.post( api_url, headers=headers, json=payload, timeout=(connect_timeout_seconds, timeout_seconds), ) response.raise_for_status() body = response.json() text = extract_text_response(body) return text or "No response from AI." except requests.exceptions.RequestException as e: return f"Error communicating with Cloud AI ({api_url}): {e}"