aia 0.9.4 → 0.9.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/images/aia.png ADDED
Binary file
@@ -94,21 +94,22 @@ module AIA
94
94
 
95
95
  def determine_operation_type
96
96
  mode = AIA.config.client.model.modalities
97
- if mode.supports?(:text_to_image)
97
+
98
+ if mode.text_to_image?
98
99
  :text_to_image
99
- elsif mode.supports?(:image_to_text)
100
+ elsif mode.image_to_text?
100
101
  :image_to_text
101
- elsif mode.supports?(:audio_to_text)
102
+ elsif mode.audio_to_text?
102
103
  :audio_to_text
103
- elsif mode.supports?(:text_to_audio)
104
+ elsif mode.text_to_audio?
104
105
  :text_to_audio
105
- elsif mode.supports?(:audio_to_audio)
106
+ elsif mode.audio_to_audio?
106
107
  :audio_to_audio
107
- elsif mode.supports?(:image_to_image)
108
+ elsif mode.image_to_image?
108
109
  :image_to_image
109
- elsif mode.supports?(:audio_to_image)
110
+ elsif mode.audio_to_image?
110
111
  :audio_to_image
111
- elsif mode.supports?(:image_to_audio)
112
+ elsif mode.image_to_audio?
112
113
  :image_to_audio
113
114
  else
114
115
  :text_to_text
@@ -299,16 +299,16 @@ module AIA
299
299
  desc "All Available models or query on [partial LLM or provider name] Examples: //llms ; //llms openai ; //llms claude"
300
300
  def available_models( args=nil, context_manager=nil)
301
301
  query = args
302
- header = "Available LLMs"
303
-
304
- if query
305
- header += " for #{query.join(' and ')}"
306
- end
302
+ header = "\nAvailable LLMs"
303
+ header += " for #{query.join(' and ')}" if query
307
304
 
308
305
  puts header + ':'
306
+ puts
307
+
308
+ q1 = query.select{|q| q.include?('_to_')}.map{|q| ':'==q[0] ? q[1...] : q}
309
+ q2 = query.reject{|q| q.include?('_to_')}
309
310
 
310
- q1 = query.select{|q| !q.start_with?(':')}
311
- q2 = query.select{|q| q.start_with?(':')}
311
+ counter = 0
312
312
 
313
313
  RubyLLM.models.all.each do |llm|
314
314
  inputs = llm.modalities.input.join(',')
@@ -316,17 +316,25 @@ module AIA
316
316
  entry = "- #{llm.id} (#{llm.provider}) #{inputs} to #{outputs}"
317
317
 
318
318
  if query.nil? || query.empty?
319
+ counter += 1
319
320
  puts entry
320
321
  next
321
322
  end
322
323
 
323
324
  show_it = true
324
- q1.each{|q| show_it &&= entry.include?(q)}
325
- q2.each{|q| show_it &&= llm.modalities.supports?(q)}
325
+ q1.each{|q| show_it &&= llm.modalities.send("#{q}?")}
326
+ q2.each{|q| show_it &&= entry.include?(q)}
326
327
 
327
- puts entry if show_it
328
+ if show_it
329
+ counter += 1
330
+ puts entry
331
+ end
328
332
  end
329
333
 
334
+ puts if counter > 0
335
+ puts "#{counter} LLMs matching your query"
336
+ puts
337
+
330
338
  ""
331
339
  end
332
340
  alias_method :am, :available_models
@@ -96,17 +96,17 @@ module AIA
96
96
  modes = @chat.model.modalities
97
97
 
98
98
  # TODO: Need to consider how to handle multi-mode models
99
- if modes.supports? :text_to_text
99
+ if modes.text_to_text?
100
100
  text_to_text(prompt)
101
101
 
102
- elsif modes.supports? :image_to_text
102
+ elsif modes.image_to_text?
103
103
  image_to_text(prompt)
104
- elsif modes.supports? :text_to_image
104
+ elsif modes.text_to_image?
105
105
  text_to_image(prompt)
106
106
 
107
- elsif modes.supports? :text_to_audio
107
+ elsif modes.text_to_audio?
108
108
  text_to_audio(prompt)
109
- elsif modes.supports? :audio_to_text
109
+ elsif modes.audio_to_text?
110
110
  audio_to_text(prompt)
111
111
 
112
112
  else
data/lib/aia/utility.rb CHANGED
@@ -21,7 +21,7 @@ module AIA
21
21
  (O) using #{AIA.config.adapter} (v#{RubyLLM::VERSION})
22
22
  __||__ \\) model db was last refreshed on
23
23
  [/______\\] / #{AIA.config.last_refresh}
24
- / \\__AI__/ \\/ #{AIA.config.tool_paths.empty? ? 'I forgot my toolbox' : 'I brought some tools'}
24
+ / \\__AI__/ \\/ #{AIA.config.tool_paths.empty? ? 'You can share my tools' : 'I will also use your tools'}
25
25
  / /__\\
26
26
  (\\ /____\\ #{AIA.config.tool_paths.empty? ? '' : 'My Toolbox contains:'}
27
27
  ROBOT
data/lib/aia.rb CHANGED
@@ -5,15 +5,19 @@
5
5
  # provides an interface for interacting with AI models and managing prompts.
6
6
 
7
7
  require 'ruby_llm'
8
+ require 'ruby_llm/mcp'
9
+ require 'shared_tools'
10
+ require 'shared_tools/ruby_llm'
8
11
  require 'prompt_manager'
9
12
 
13
+
10
14
  require 'debug_me'
11
15
  include DebugMe
12
16
  $DEBUG_ME = false
13
17
  DebugMeDefaultOptions[:skip1] = true
14
18
 
15
19
  require_relative 'extensions/openstruct_merge' # adds self.merge self.get_value
16
- require_relative 'extensions/ruby_llm/modalities' # adds model.modalities.supports? :text-to-text etc.
20
+ require_relative 'extensions/ruby_llm/modalities' # adds model.modalities.text_to_text? etc.
17
21
 
18
22
  require_relative 'refinements/string.rb' # adds #include_any? #include_all?
19
23
 
@@ -1,26 +1,34 @@
1
1
  # lib/extensions/ruby_llm/modalities.rb
2
- # A models "modes" are often expressed in terms like:
3
- # text-to-text
4
- # text_to_audio
5
- # audio to image
6
- # image2image
7
- # This new supports? method tests the models modalities against
8
- # these common expressions
9
2
 
10
3
  class RubyLLM::Model::Modalities
11
- def supports?(query_mode)
12
- parts = query_mode
13
- .to_s
14
- .downcase
15
- .split(/2|-to-| to |_to_/)
16
- .map(&:strip)
17
-
18
- if 2 == parts.size
19
- input.include?(parts[0]) && output.include?(parts[1])
20
- elsif 1 == parts.size
21
- input.include?(parts[0]) || output.include?(parts[0])
22
- else
23
- false
24
- end
25
- end
4
+ #
5
+ def text_to_text? = input.include?('text') && output.include?('text')
6
+ def text_to_embeddings? = input.include?('text') && output.include?('embeddings')
7
+ def text_to_audio? = input.include?('text') && output.include?('audio')
8
+ def text_to_image? = input.include?('text') && output.include?('image')
9
+ def text_to_moderation? = input.include?('text') && output.include?('moderation')
10
+ #
11
+ def image_to_text? = input.include?('image') && output.include?('text')
12
+ def image_to_embeddings? = input.include?('image') && output.include?('embeddings')
13
+ def image_to_audio? = input.include?('image') && output.include?('audio')
14
+ def image_to_image? = input.include?('image') && output.include?('image')
15
+ def image_to_moderation? = input.include?('image') && output.include?('moderation')
16
+ #
17
+ def pdf_to_text? = input.include?('pdf') && output.include?('text')
18
+ def pdf_to_embeddings? = input.include?('pdf') && output.include?('embeddings')
19
+ def pdf_to_audio? = input.include?('pdf') && output.include?('audio')
20
+ def pdf_to_image? = input.include?('pdf') && output.include?('image')
21
+ def pdf_to_moderation? = input.include?('pdf') && output.include?('moderation')
22
+ #
23
+ def audio_to_text? = input.include?('audio') && output.include?('text')
24
+ def audio_to_embeddings? = input.include?('audio') && output.include?('embeddings')
25
+ def audio_to_audio? = input.include?('audio') && output.include?('audio')
26
+ def audio_to_image? = input.include?('audio') && output.include?('image')
27
+ def audio_to_moderation? = input.include?('audio') && output.include?('moderation')
28
+ #
29
+ def file_to_text? = input.include?('file') && output.include?('text')
30
+ def file_to_embeddings? = input.include?('file') && output.include?('embeddings')
31
+ def file_to_audio? = input.include?('file') && output.include?('audio')
32
+ def file_to_image? = input.include?('file') && output.include?('image')
33
+ def file_to_moderation? = input.include?('file') && output.include?('moderation')
26
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aia
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.4
4
+ version: 0.9.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dewayne VanHoozer
@@ -43,28 +43,42 @@ dependencies:
43
43
  requirements:
44
44
  - - ">="
45
45
  - !ruby/object:Gem::Version
46
- version: 0.5.4
46
+ version: 0.5.6
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - ">="
52
52
  - !ruby/object:Gem::Version
53
- version: 0.5.4
53
+ version: 0.5.6
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: ruby_llm
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
- version: 1.3.0
60
+ version: 1.3.1
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - ">="
66
66
  - !ruby/object:Gem::Version
67
- version: 1.3.0
67
+ version: 1.3.1
68
+ - !ruby/object:Gem::Dependency
69
+ name: ruby_llm-mcp
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
68
82
  - !ruby/object:Gem::Dependency
69
83
  name: reline
70
84
  requirement: !ruby/object:Gem::Requirement
@@ -79,6 +93,20 @@ dependencies:
79
93
  - - ">="
80
94
  - !ruby/object:Gem::Version
81
95
  version: '0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: shared_tools
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ type: :runtime
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
82
110
  - !ruby/object:Gem::Dependency
83
111
  name: shellwords
84
112
  requirement: !ruby/object:Gem::Requirement
@@ -292,6 +320,7 @@ files:
292
320
  - examples/tools/list_files.rb
293
321
  - examples/tools/read_file.rb
294
322
  - examples/tools/run_shell_command.rb
323
+ - images/aia.png
295
324
  - justfile
296
325
  - lib/aia.rb
297
326
  - lib/aia/aia_completion.bash