File size: 2,580 Bytes
9012b52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import json
import re

# Suppress all UserWarnings
from openai import OpenAI

from config import get_settings

LLM_CLIENT = OpenAI(
    api_key=get_settings().openai_api_key,
    timeout=20,
)


def parse_response(response: str) -> tuple[str, list[dict] | None]:
    answer_match = re.search(
        r"\[ANSWER\]\n(.+?)(?=\n\[(.*?)\])", response, re.DOTALL
    )
    related_docs_match = re.search(r"\[REFERENCE\]\n(.+)", response, re.DOTALL)

    if answer_match:
        answer = answer_match.group(1).strip()
        related_docs = None

        if related_docs_match:
            related_docs_str = (
                related_docs_match.group(1).strip().replace("```", "")
            )
            try:
                related_docs = json.loads(related_docs_str)
            except Exception:
                print(f"failed to parse related docs: {related_docs_str}")

        return answer, related_docs

    raise ValueError(f"failed to parse response: {response}")


def parse_histories(histories: list[str, str]):
    conversational_histories = []
    for history in histories:
        user_message, assistant_message = history
        conversational_histories.extend(
            [
                {"role": "user", "content": user_message},
                {"role": "assistant", "content": assistant_message},
            ]
        )

    return conversational_histories


def get_chat_model_response(
    model: str,
    messages: list[str],
    temperature: float = 0,
    tools: list | None = None,
):
    if tools is not None:
        chat_model_response = LLM_CLIENT.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature,
            tools=tools,
        )
    else:
        chat_model_response = LLM_CLIENT.chat.completions.create(
            model=model,
            messages=messages,
            temperature=temperature,
        )

    return chat_model_response


def parse_tools_message(response) -> dict:
    response_choices = response.choices
    if len(response_choices) == 0:
        return None

    tool_calls_response = response_choices[0].message.tool_calls
    if not tool_calls_response:
        return None

    response_choice_argument = tool_calls_response[0].function.arguments
    response_choice_argument_dict = json.loads(response_choice_argument)
    return response_choice_argument_dict


def parse_message(response) -> str | None:
    response_choices = response.choices
    if len(response.choices) == 0:
        return None

    return response_choices[0].message.content