conversation-extraction / llm_client.py
Teera's picture
d
c5027b2 verified
"""
Azure OpenAI client wrapper for LLM-based analysis.
"""
import os
import json
from openai import AzureOpenAI
from dotenv import load_dotenv
from prompts import FOOTBALL_ANALYSIS_SYSTEM_PROMPT, FOOTBALL_ANALYSIS_USER_PROMPT
load_dotenv()
AZURE_OPENAI_KEY = os.getenv("AZURE_OPENAI_KEY")
AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_API_VERSION = os.getenv("AZURE_OPENAI_API_VERSION", "2024-12-01-preview")
AZURE_OPENAI_DEPLOYMENT = os.getenv("AZURE_OPENAI_DEPLOYMENT", "gpt-5.2-chat")
def get_openai_client():
"""Create and return an Azure OpenAI client."""
return AzureOpenAI(
api_key=AZURE_OPENAI_KEY,
azure_endpoint=AZURE_OPENAI_ENDPOINT,
api_version=AZURE_OPENAI_API_VERSION,
)
def analyze_football_content(transcript: str) -> dict:
"""
Send transcribed text to Azure OpenAI for football content analysis.
Args:
transcript: The transcribed speech text.
Returns:
A dict with categorized football data (teams, leagues, sentiment, etc.)
"""
if not transcript or not transcript.strip():
return {"error": "ไม่มีข้อความให้วิเคราะห์"}
client = get_openai_client()
user_message = FOOTBALL_ANALYSIS_USER_PROMPT.format(transcript=transcript)
try:
response = client.chat.completions.create(
model=AZURE_OPENAI_DEPLOYMENT,
messages=[
{"role": "system", "content": FOOTBALL_ANALYSIS_SYSTEM_PROMPT},
{"role": "user", "content": user_message},
],
max_completion_tokens=4096,
)
content = response.choices[0].message.content.strip()
# Clean up markdown code fences if the model wraps JSON in ```json ... ```
if content.startswith("```"):
content = content.split("\n", 1)[1] # Remove first line (```json)
content = content.rsplit("```", 1)[0] # Remove last ```
content = content.strip()
result = json.loads(content)
return result
except json.JSONDecodeError:
return {
"error": "LLM ตอบกลับมาไม่ใช่ JSON ที่ถูกต้อง",
"raw_response": content,
}
except Exception as e:
return {"error": f"เกิดข้อผิดพลาด: {str(e)}"}
def format_analysis_result(result: dict) -> str:
"""Format the analysis result as a pretty JSON string for display."""
return json.dumps(result, ensure_ascii=False, indent=2)