gpt-storyteller/src/builders/openai_insert.cr

59 lines
1.5 KiB
Crystal

require "pretty_print"
require "colorize"
module Builder
class OpenAIInsert
alias InsertBuffer = NamedTuple(before: String, after: String)
getter verbose : Bool
def initialize(@verbose)
end
# skip prelude_zone
# skip future_zone
def build(prompt : Prompt) : InsertBuffer
insert_data : InsertBuffer = { before: "", after: "" }
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|
insert_data["before"] += 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