ai-learning-path-generator / src /direct_openai.py
“shubhamdhamal”
Deploy Flask app with Docker
7644eac
"""
Direct OpenAI API handler to bypass any potential middleware issues.
"""
import os
import json
import requests
from typing import Dict, Any, List, Optional
from langsmith import traceable as langsmith_traceable
@langsmith_traceable(name="OpenAI_Direct_Call")
def generate_completion(
prompt: str,
system_message: str = "You are an expert educational AI assistant that specializes in creating personalized learning paths.",
model: str = "gpt-3.5-turbo",
temperature: float = 0.7,
max_tokens: int = 1000,
timeout: int = 120
) -> str:
"""
Generate a completion using direct HTTP requests to OpenAI API.
Args:
prompt: The user prompt
system_message: Optional system message
model: The OpenAI model to use
temperature: Sampling temperature
max_tokens: Maximum tokens to generate
Returns:
The generated text
"""
# Get API key from environment or directly from file if needed
api_key = os.environ.get("OPENAI_API_KEY")
# Fallback to direct read if environment variable isn't working
if not api_key or len(api_key) < 20:
try:
with open('.env', 'r') as f:
for line in f:
if line.startswith('OPENAI_API_KEY='):
api_key = line.strip().split('=', 1)[1]
break
except Exception as e:
print(f"Error reading API key from file: {e}")
if not api_key:
raise ValueError("OpenAI API key not found in environment variables or .env file")
print(f"Using API key starting with: {api_key[:10]}...")
# API endpoint
url = "https://api.openai.com/v1/chat/completions"
# Request headers
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}"
}
# Request payload
payload = {
"model": model,
"messages": [
{"role": "system", "content": system_message},
{"role": "user", "content": prompt}
],
"temperature": temperature,
"max_tokens": max_tokens
}
print("Making direct API request to OpenAI...")
# Make the request
try:
response = requests.post(
url,
headers=headers,
json=payload,
timeout=timeout
)
# Check if request was successful
response.raise_for_status()
# Parse response
result = response.json()
print("Received response from OpenAI API")
# Extract and return the generated text
if "choices" in result and len(result["choices"]) > 0:
return result["choices"][0]["message"]["content"]
else:
raise ValueError(f"Unexpected API response: {json.dumps(result)}")
except requests.exceptions.RequestException as e:
print(f"API request failed: {str(e)}")
if hasattr(e, "response") and e.response is not None:
status_code = e.response.status_code
try:
error_data = e.response.json()
error_message = f"Error code: {status_code} - {json.dumps(error_data)}"
except:
error_message = f"Error code: {status_code} - {e.response.text}"
else:
error_message = str(e)
raise ValueError(f"OpenAI API request failed: {error_message}")