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

1"""AI scoring using OpenAI Chat Completions API.""" 

2 

3import json 

4import logging 

5from typing import Any 

6 

7from openai import OpenAI 

8 

9from app.config import settings 

10 

11logger = logging.getLogger(__name__) 

12 

13client = OpenAI(api_key=settings.openai_api_key) 

14 

15 

16class OpenAiError(Exception): 

17 """Raised when AI query fails.""" 

18 

19 

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.""" 

25 

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 ) 

37 

38 content = response.choices[0].message.content 

39 

40 if not content: 

41 raise OpenAiError("Empty response from OpenAI") 

42 

43 try: 

44 return json.loads(content) 

45 

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 

49 

50 except Exception as exc: 

51 logger.exception("OpenAI query failed") 

52 raise OpenAiError from exc