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
|
# File 'lib/aicli/commands/chat.rb', line 13
def run
config = Helpers::Config.get
chat = Helpers::Completion.start_chat(config)
restored = Helpers::Context.load_messages
Helpers::Context.apply_to_chat(chat) if restored.any?
pastel = Pastel.new
prompt = TTY::Prompt.new(interrupt: :error)
Helpers::Context.seed_prompt_history(prompt)
puts ''
puts "#{config['PROVIDER']} / #{config['MODEL']} #{pastel.dim('Ctrl+d to quit')}"
catch(:chat_quit) do
prompt.on(:keyctrl_d) { throw :chat_quit }
loop do
begin
user_prompt = prompt.ask(pastel.cyan("#{Helpers::I18n.t('You')}:")) do |q|
q.required true
q.validate(/.+/, Helpers::I18n.t('Please enter a prompt.'))
end
rescue TTY::Reader::InputInterrupt
print "\r\e[2K"
next
end
if user_prompt.nil? || user_prompt.strip.downcase == 'exit'
throw :chat_quit
end
spinner = TTY::Spinner.new("[:spinner] #{Helpers::I18n.t('THINKING...')}", format: :dots)
spinner.auto_spin
started = false
response = Helpers::Completion.stream_chat_message(
chat,
user_prompt,
writer: lambda { |chunk|
unless started
spinner.success(pastel.green('ai:'))
puts ''
started = true
end
print chunk
}
)
unless started
spinner.success(pastel.green('ai:'))
puts ''
end
puts ''
puts ''
Helpers::Context.save_from_chat(chat)
offer_to_run_commands(response, pastel)
end
end
Helpers::Context.save_from_chat(chat)
puts ''
puts Helpers::I18n.t('Goodbye!')
end
|