60 lines
1.5 KiB
Crystal
60 lines
1.5 KiB
Crystal
|
|
||
|
require "pretty_print"
|
||
|
require "colorize"
|
||
|
|
||
|
module Builder
|
||
|
class OpenAIInsert
|
||
|
alias Message = NamedTuple(role: String, content: String)
|
||
|
alias Chat = Array(Message)
|
||
|
|
||
|
getter verbose : Bool
|
||
|
def initialize(@verbose)
|
||
|
|
||
|
end
|
||
|
|
||
|
# skip prelude_zone
|
||
|
# skip future_zone
|
||
|
def build(prompt : Prompt) : Chat
|
||
|
chat = [] of Message
|
||
|
|
||
|
token_limit = 2_900
|
||
|
mandatory_token_count = (
|
||
|
prompt.system_zone.token_count +
|
||
|
prompt.present_zone.token_count
|
||
|
)
|
||
|
|
||
|
## Build mandatory system messages
|
||
|
prompt.system_zone.each do |content|
|
||
|
chat << { role: "system", content: content }
|
||
|
end
|
||
|
|
||
|
## Build mandatory system messages
|
||
|
tmp_chat = [] of Message
|
||
|
tmp_token_count = 0
|
||
|
prompt.past_zone.reverse_each do |content|
|
||
|
estimated_token_count = (content.size/4) + tmp_token_count + mandatory_token_count
|
||
|
pp tmp_chat.reverse if @verbose
|
||
|
puts "ESTIMATE: #{estimated_token_count} (limit=#{token_limit})".colorize(:yellow).to_s if @verbose
|
||
|
|
||
|
break if estimated_token_count >= token_limit
|
||
|
|
||
|
tmp_chat << { role: "user", content: content }
|
||
|
tmp_token_count += (content.size / 4)
|
||
|
end
|
||
|
chat.concat(tmp_chat.reverse)
|
||
|
|
||
|
prompt.present_zone.each do |content|
|
||
|
chat << { role: "user", content: content }
|
||
|
end
|
||
|
|
||
|
prompt.future_zone.each do |content|
|
||
|
chat << { role: "user", content: content }
|
||
|
end
|
||
|
|
||
|
# pp chat
|
||
|
chat
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|