ai_client 0.3.1 → 0.4.0
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +13 -3
- data/README.md +104 -8
- data/lib/ai_client/chat.rb +64 -7
- data/lib/ai_client/config.yml +11 -17
- data/lib/ai_client/configuration.rb +12 -1
- data/lib/ai_client/middleware.rb +1 -1
- data/lib/ai_client/models.yml +526 -416
- data/lib/ai_client/open_router_extensions.rb +4 -1
- data/lib/ai_client/version.rb +4 -1
- data/lib/ai_client.rb +58 -32
- metadata +2 -2
@@ -81,7 +81,6 @@ class AiClient
|
|
81
81
|
end
|
82
82
|
|
83
83
|
|
84
|
-
private
|
85
84
|
|
86
85
|
# Retrieves the ORC client instance.
|
87
86
|
#
|
@@ -91,6 +90,10 @@ class AiClient
|
|
91
90
|
@orc_client ||= add_open_router_extensions || raise("OpenRouter extensions are not available")
|
92
91
|
end
|
93
92
|
|
93
|
+
|
94
|
+
private
|
95
|
+
|
96
|
+
|
94
97
|
# Retrieves models from the ORC client.
|
95
98
|
#
|
96
99
|
# @return [Array<Hash>] List of models.
|
data/lib/ai_client/version.rb
CHANGED
data/lib/ai_client.rb
CHANGED
@@ -85,10 +85,12 @@ class AiClient
|
|
85
85
|
attr_reader :client, # OmniAI's client instance
|
86
86
|
:provider, # [Symbol]
|
87
87
|
:model, # [String]
|
88
|
-
:logger,
|
88
|
+
:logger,
|
89
|
+
:last_message,
|
89
90
|
:last_response,
|
90
91
|
:timeout,
|
91
|
-
:config
|
92
|
+
:config, # Instance configuration
|
93
|
+
:context # chat-bot context
|
92
94
|
|
93
95
|
# Initializes a new AiClient instance.
|
94
96
|
#
|
@@ -114,35 +116,16 @@ class AiClient
|
|
114
116
|
# - :timeout [Integer] Timeout value for requests.
|
115
117
|
# @yield [config] An optional block to configure the instance.
|
116
118
|
#
|
117
|
-
def initialize(model, **options, &block)
|
118
|
-
|
119
|
-
@
|
120
|
-
|
121
|
-
# Yield the @config to a block if given
|
122
|
-
yield(@config) if block_given?
|
123
|
-
|
124
|
-
# Merge in an instance-specific YAML file
|
125
|
-
if options.has_key?(:config)
|
126
|
-
@config.merge! Config.load(options[:config])
|
127
|
-
options.delete(:config) # Lconfig not supported by OmniAI
|
128
|
-
end
|
129
|
-
|
130
|
-
@model = model
|
131
|
-
explicit_provider = options.fetch(:provider, config.provider)
|
132
|
-
|
133
|
-
@provider = validate_provider(explicit_provider) || determine_provider(model)
|
134
|
-
|
135
|
-
provider_config = @config.providers[@provider] || {}
|
136
|
-
|
137
|
-
@logger = options[:logger] || @config.logger
|
138
|
-
@timeout = options[:timeout] || @config.timeout
|
139
|
-
@base_url = options[:base_url] || provider_config[:base_url]
|
140
|
-
@options = options.merge(provider_config)
|
119
|
+
def initialize(model = nil, **options, &block)
|
120
|
+
@context = [] # An Array of String or response objects
|
121
|
+
@last_messages = nil
|
122
|
+
@last_response = nil
|
141
123
|
|
142
|
-
|
143
|
-
|
124
|
+
setup_config(options, &block)
|
125
|
+
set_provider_and_model(model, options[:provider])
|
126
|
+
setup_instance_variables(options)
|
144
127
|
|
145
|
-
@
|
128
|
+
@client = create_client
|
146
129
|
end
|
147
130
|
|
148
131
|
|
@@ -174,13 +157,13 @@ class AiClient
|
|
174
157
|
# @return [String] The extracted content.
|
175
158
|
# @raise [NotImplementedError] If content extraction is not implemented for the provider.
|
176
159
|
#
|
177
|
-
def content
|
160
|
+
def content(response=last_response)
|
178
161
|
case @provider
|
179
162
|
when :localai, :mistral, :ollama, :open_router, :openai
|
180
|
-
|
163
|
+
response.data.tunnel 'content'
|
181
164
|
|
182
165
|
when :anthropic, :google
|
183
|
-
|
166
|
+
response.data.tunnel 'text'
|
184
167
|
|
185
168
|
else
|
186
169
|
raise NotImplementedError, "Content extraction not implemented for provider: #{@provider}"
|
@@ -219,6 +202,47 @@ class AiClient
|
|
219
202
|
##############################################
|
220
203
|
private
|
221
204
|
|
205
|
+
def setup_config(options, &block)
|
206
|
+
@config = self.class.class_config.dup
|
207
|
+
|
208
|
+
yield(@config) if block_given?
|
209
|
+
|
210
|
+
if options.key?(:config)
|
211
|
+
@config.merge!(Config.load(options[:config]))
|
212
|
+
options.delete(:config) # config not supported by OmniAI
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
def set_provider_and_model(my_model, my_provider)
|
218
|
+
if my_model.nil?
|
219
|
+
if my_provider.nil?
|
220
|
+
@provider = @config.default_provider.to_sym
|
221
|
+
else
|
222
|
+
@provider = validate_provider(my_provider)
|
223
|
+
end
|
224
|
+
@model = @config.default_model[@provider]
|
225
|
+
else
|
226
|
+
@model = my_model
|
227
|
+
if my_provider.nil?
|
228
|
+
@provider = determine_provider(my_model)
|
229
|
+
else
|
230
|
+
@provider = validate_provider(my_provider)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
|
236
|
+
def setup_instance_variables(options)
|
237
|
+
provider_config = @config.providers[@provider] || {}
|
238
|
+
|
239
|
+
@logger = options[:logger] || @config.logger
|
240
|
+
@timeout = options[:timeout] || @config.timeout
|
241
|
+
@base_url = options[:base_url] || provider_config[:base_url]
|
242
|
+
@options = options.merge(provider_config)
|
243
|
+
end
|
244
|
+
|
245
|
+
|
222
246
|
# Validates the specified provider.
|
223
247
|
#
|
224
248
|
# @param provider [Symbol] The provider to validate.
|
@@ -296,6 +320,8 @@ class AiClient
|
|
296
320
|
# @raise [ArgumentError] If the model is unsupported.
|
297
321
|
#
|
298
322
|
def determine_provider(model)
|
323
|
+
return nil if model.nil? || model.empty?
|
324
|
+
|
299
325
|
config.provider_patterns.find { |provider, pattern| model.match?(pattern) }&.first ||
|
300
326
|
raise(ArgumentError, "Unsupported model: #{model}")
|
301
327
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ai_client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dewayne VanHoozer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_hash
|