Class: SmartPrompt::Conversation

Inherits:
Object
  • Object
show all
Includes:
APIHandler
Defined in:
lib/smart_prompt/conversation.rb

Constant Summary

Constants included from APIHandler

APIHandler::MAX_RETRIES, APIHandler::RETRY_OPTIONS

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(engine) ⇒ Conversation

Returns a new instance of Conversation.



10
11
12
13
14
15
16
17
18
19
# File 'lib/smart_prompt/conversation.rb', line 10

def initialize(engine)
  SmartPrompt.logger.info "Create Conversation"
  @messages = []
  @engine = engine
  @adapters = engine.adapters
  @llms = engine.llms
  @templates = engine.templates
  @current_adapter = engine.current_adapter
  @last_response = nil
end

Instance Attribute Details

#config_fileObject (readonly)

Returns the value of attribute config_file.



8
9
10
# File 'lib/smart_prompt/conversation.rb', line 8

def config_file
  @config_file
end

#last_responseObject (readonly)

Returns the value of attribute last_response.



8
9
10
# File 'lib/smart_prompt/conversation.rb', line 8

def last_response
  @last_response
end

#messagesObject (readonly)

Returns the value of attribute messages.



8
9
10
# File 'lib/smart_prompt/conversation.rb', line 8

def messages
  @messages
end

Instance Method Details

#embeddings(length) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# File 'lib/smart_prompt/conversation.rb', line 85

def embeddings(length)
  Retriable.retriable(RETRY_OPTIONS) do
    raise ConfigurationError, "No LLM selected" if @current_llm.nil?
    text = ""
    @messages.each do |msg|
      if msg[:role]=="user"
        text = msg[:content]
      end
    end
    @last_response = @current_llm.embeddings(text, @model_name)
    @messages=[]
    @messages << { role: 'system', content: @sys_msg }
    normalize(@last_response, length)
  end
end

#model(model_name) ⇒ Object



27
28
29
# File 'lib/smart_prompt/conversation.rb', line 27

def model(model_name)
  @model_name = model_name
end

#normalize(x, length) ⇒ Object



75
76
77
78
79
80
81
82
83
# File 'lib/smart_prompt/conversation.rb', line 75

def normalize(x, length)
  if x.length > length
    x = Numo::NArray.cast(x[0..length-1])      
    norm = Math.sqrt((x * x).sum)
    return (x / norm).to_a
  else
    return x.concat([0] * (x.length - length))
  end
end

#prompt(template_name, params = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/smart_prompt/conversation.rb', line 35

def prompt(template_name, params = {})
  if template_name.class == Symbol
    template_name = template_name.to_s
    SmartPrompt.logger.info "Use template #{template_name}"
    raise "Template #{template_name} not found" unless @templates.key?(template_name)
    content = @templates[template_name].render(params)
    @messages << { role: 'user', content: content }
    self
  else
    @messages << { role: 'user', content: template_name }
    self
  end
end

#safe_send_msgObject



63
64
65
66
67
68
69
70
71
72
73
# File 'lib/smart_prompt/conversation.rb', line 63

def safe_send_msg
  Retriable.retriable(RETRY_OPTIONS) do
    raise ConfigurationError, "No LLM selected" if @current_llm.nil?
    @last_response = @current_llm.send_request(@messages, @model_name)
    @messages=[]
    @messages << { role: 'system', content: @sys_msg }
    @last_response
  end
rescue => e
  return "Failed to call LLM after #{MAX_RETRIES} attempts: #{e.message}"
end

#send_msgObject



55
56
57
58
59
60
61
# File 'lib/smart_prompt/conversation.rb', line 55

def send_msg
  raise "No LLM selected" if @current_llm.nil?
  @last_response = @current_llm.send_request(@messages, @model_name, @temperature)
  @messages=[]
  @messages << { role: 'system', content: @sys_msg }
  @last_response
end

#sys_msg(message) ⇒ Object



49
50
51
52
53
# File 'lib/smart_prompt/conversation.rb', line 49

def sys_msg(message)
  @sys_msg = message
  @messages << { role: 'system', content: message }
  self
end

#temperature(temperature) ⇒ Object



31
32
33
# File 'lib/smart_prompt/conversation.rb', line 31

def temperature(temperature)
  @temperature = temperature
end

#use(llm_name) ⇒ Object



21
22
23
24
25
# File 'lib/smart_prompt/conversation.rb', line 21

def use(llm_name)
  raise "Adapter #{adapter_name} not configured" unless @llms.key?(llm_name)
  @current_llm = @llms[llm_name]
  self
end