Coverage for backend / app / job_rating / chatgpt.py: 41%
22 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-17 21:34 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-17 21:34 +0000
1"""AI scoring using OpenAI Chat Completions API."""
3import json
4import logging
5from typing import Any
7from openai import OpenAI
9from app.config import settings
11logger = logging.getLogger(__name__)
13client = OpenAI(api_key=settings.openai_api_key)
16class OpenAiError(Exception):
17 """Raised when AI query fails."""
20def openai_query(system_prompt: str, llm_prompt: str) -> dict[str, Any]:
21 """Query openai chat completions API with constructed prompt.
22 :param system_prompt: System prompt defining the AI's role.
23 :param llm_prompt: Fully constructed prompt describing the job.
24 return: parsed JSON output."""
26 try:
27 # noinspection PyTypeChecker
28 response = client.chat.completions.create(
29 model="gpt-4.1-mini",
30 messages=[
31 {"role": "system", "content": system_prompt},
32 {"role": "user", "content": llm_prompt},
33 ],
34 response_format={"type": "json_object"},
35 temperature=0.2,
36 )
38 content = response.choices[0].message.content
40 if not content:
41 raise OpenAiError("Empty response from OpenAI")
43 try:
44 return json.loads(content)
46 except json.JSONDecodeError as exc:
47 logger.error("Invalid JSON returned by OpenAI: %s", content)
48 raise OpenAiError("Invalid JSON from OpenAI") from exc
50 except Exception as exc:
51 logger.exception("OpenAI query failed")
52 raise OpenAiError from exc