File size: 3,819 Bytes
a5a8279
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3f14ec0
a5a8279
 
3f14ec0
a5a8279
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3f14ec0
a5a8279
 
 
 
 
 
 
 
 
 
25e3a59
a5a8279
 
 
 
 
 
 
 
 
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
import os
import openai
"""
A module to manage responses from the OpenAI Response API for an IT Helpdesk assistant 
at Harvey Mudd College. This module initializes the OpenAI client and provides a method 
to create responses using RAG (Retrieval-Augmented Generation) to user queries. It uses 
a vector store for retrieval of knowledge base documents and generates responses using 
the specified OpenAI model. The module also loads a developer message from a text file 
to prompt engineer responses from the AI model.
"""

# Load the OpenAI API key from the environment variable
# If the API key is not set, raise an error.
if "OPENAI_API_KEY" not in os.environ:
    raise ValueError("OPENAI_API_KEY environment variable is not set.")
api_key=os.getenv("OPENAI_API_KEY")

class ResponseManager:
    """
    A class to manage responses from the OpenAI API for an IT Helpdesk assistant.
    This class initializes the OpenAI client and provides a method to create responses
    to user queries using the specified OpenAI model.
    """
    def __init__(self, vector_store_id):
        """
        Initialize the ResponseManager with a vector store ID.
        :param vector_store_id: The ID of the vector store to use for file search.
        """
        # Initialize the OpenAI client
        # Note: The OpenAI client is initialized with the API key set in the environment variable
        # This is a placeholder for the actual OpenAI client initialization
        # In a real-world scenario, you would use the appropriate OpenAI client library
        # For example, if using the OpenAI Python library, you would do:    
        self.client = openai.OpenAI(api_key=api_key)
        self.vector_store_id = vector_store_id
        self.previous_response_id = None
        
        # Load the meta prompt from the text file
        # This message is used to provide context for the AI model
        meta_prompt_file = 'config/meta_prompt.txt'
        if not os.path.exists(meta_prompt_file):
            raise FileNotFoundError(f"Meta prompt file '{meta_prompt_file}' not found.")
        with open(meta_prompt_file, 'r') as file:
            self.meta_prompt = file.read().strip()

    def create_response(self, query, model: str= "gpt-4o-mini",
                        temperature=0, max_output_tokens=800,
                        max_num_results=7):
        """
        Create a response to a user query using the OpenAI API.
        :param query: The user query to respond to.
        :param model: The OpenAI model to use (default is "gpt-4o-mini").
        :param temperature: The temperature for the response (default is 0).
        :param max_output_tokens: The maximum number of output tokens (default is 800).
        :param max_num_results: The maximum number of search results to return (default is 7).
        :param verbose: Whether to print the response (default is False).
        :return: The response text from the OpenAI API.
        """
        if self.previous_response_id is None:
            input=[{"role": "developer", "content": self.meta_prompt}, 
                   {"role": "user", "content": query}]
        else:
            input=[{"role": "user", "content": query}]

        response = self.client.responses.create(
            model=model,
            previous_response_id=self.previous_response_id,
            input=input,
            tools=[{
                "type": "file_search",
                "vector_store_ids": [self.vector_store_id], # ["<vector_store_id>"]
                "max_num_results": max_num_results}
            ],
            temperature=temperature,
            max_output_tokens = max_output_tokens,
            # include=["output[*].file_search_call.search_results"]
        )
        self.previous_response_id = response.id

        return response.output_text