Class: LLM::Repl
- Inherits:
-
Object
- Object
- LLM::Repl
- Defined in:
- lib/llm/repl.rb,
lib/llm/repl/bar.rb,
lib/llm/repl/node.rb,
lib/llm/repl/input.rb,
lib/llm/repl/buffer.rb,
lib/llm/repl/status.rb,
lib/llm/repl/stream.rb,
lib/llm/repl/walker.rb,
lib/llm/repl/window.rb,
lib/llm/repl/command.rb,
lib/llm/repl/markdown.rb,
lib/llm/repl/commands/exit.rb,
lib/llm/repl/commands/help.rb,
lib/llm/repl/commands/compact.rb
Overview
The LLM::Repl class provides a small read-eval-print loop around an instance of LLM::Agent.
It can be used to keep talking to an agent after it has been set up or has performed a task. This can be useful when you want to confirm the agent handled the task correctly, or for it to correct course after a mistake was made.
Defined Under Namespace
Classes: Bar, Buffer, Command, Help, Input, Markdown, Node, Status, Stream, Walker, Window
Instance Attribute Summary collapse
-
#agent ⇒ Object
readonly
Returns the value of attribute agent.
-
#buffer ⇒ Object
readonly
Returns the value of attribute buffer.
-
#input ⇒ Object
readonly
Returns the value of attribute input.
-
#name ⇒ Object
readonly
Returns the value of attribute name.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#provider ⇒ Object
readonly
Returns the value of attribute provider.
-
#status ⇒ Object
Returns the value of attribute status.
-
#stream ⇒ Object
readonly
Returns the value of attribute stream.
-
#thread ⇒ Object
readonly
Returns the value of attribute thread.
-
#tools ⇒ Object
readonly
Returns the value of attribute tools.
-
#width ⇒ Object
readonly
Returns the value of attribute width.
-
#window ⇒ Object
readonly
Returns the value of attribute window.
Instance Method Summary collapse
- #initialize(agent:, name: nil, tools: [], skills: [], path: nil) ⇒ LLM::Repl constructor
-
#markdown(chars) ⇒ Array<Node>
Returns an AST.
- #start ⇒ void
- #thinking_text ⇒ String
- #write(chars, attrs = nil, method: :append) ⇒ void
- #write_message(user, content, method: :append) ⇒ void
Constructor Details
#initialize(agent:, name: nil, tools: [], skills: [], path: nil) ⇒ LLM::Repl
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/llm/repl.rb', line 45 def initialize(agent:, name: nil, tools: [], skills: [], path: nil) @width = 80 @path = path @name = name || "agent" @agent = configure(agent:, path:) @provider = agent.llm.name @status = Status.new(self) @buffer = Buffer.new(self) @input = Input.new(self, height: 3) @window = Window.new(self) @thread = nil @queue = Queue.new @stream = Stream.new(self, @queue) @skills = skills.map do |path| ## # I'm not sure it would make sense to expose # the underlying context or not. In the meantime, # this works and meets the expectations of the # LLM::Skill class. ctx = agent.instance_variable_get(:@ctx) LLM::Skill.load(path).to_tool(ctx) end @tools = [agent.params[:tools], @skills, tools].flatten.compact end |
Instance Attribute Details
#agent ⇒ Object (readonly)
Returns the value of attribute agent.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def agent @agent end |
#buffer ⇒ Object (readonly)
Returns the value of attribute buffer.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def buffer @buffer end |
#input ⇒ Object (readonly)
Returns the value of attribute input.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def input @input end |
#name ⇒ Object (readonly)
Returns the value of attribute name.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def name @name end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def path @path end |
#provider ⇒ Object (readonly)
Returns the value of attribute provider.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def provider @provider end |
#status ⇒ Object
Returns the value of attribute status.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def status @status end |
#stream ⇒ Object (readonly)
Returns the value of attribute stream.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def stream @stream end |
#thread ⇒ Object (readonly)
Returns the value of attribute thread.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def thread @thread end |
#tools ⇒ Object (readonly)
Returns the value of attribute tools.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def tools @tools end |
#width ⇒ Object (readonly)
Returns the value of attribute width.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def width @width end |
#window ⇒ Object (readonly)
Returns the value of attribute window.
29 30 31 |
# File 'lib/llm/repl.rb', line 29 def window @window end |
Instance Method Details
#markdown(chars) ⇒ Array<Node>
Returns an AST
114 115 116 |
# File 'lib/llm/repl.rb', line 114 def markdown(chars) LLM::Repl::Markdown.new(chars, width).ast end |
#start ⇒ void
This method returns an undefined value.
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
# File 'lib/llm/repl.rb', line 72 def start window.open do catch(:exit) do write tree(agent.) loop do now = Process.clock_gettime(Process::CLOCK_MONOTONIC) case input.on_char(window, input.paste? ? window.read_paste : window.getch, now) when :submit then submit when Symbol then window.redraw else window.redraw read! sleep 0.01 end end end end end |
#thinking_text ⇒ String
128 129 130 |
# File 'lib/llm/repl.rb', line 128 def thinking_text "thinking • Esc to cancel" end |
#write(chars, attrs = nil, method: :append) ⇒ void
This method returns an undefined value.
96 97 98 99 |
# File 'lib/llm/repl.rb', line 96 def write(chars, attrs = nil, method: :append) buffer.write(chars, attrs, method:) window.redraw end |
#write_message(user, content, method: :append) ⇒ void
This method returns an undefined value.
105 106 107 108 |
# File 'lib/llm/repl.rb', line 105 def (user, content, method: :append) buffer.(user, content, method:) window.redraw end |