intelligence 0.6.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +576 -0
  3. data/intelligence.gemspec +2 -1
  4. data/lib/intelligence/adapter/base.rb +13 -6
  5. data/lib/intelligence/adapter/class_methods.rb +15 -0
  6. data/lib/intelligence/adapter/module_methods.rb +41 -0
  7. data/lib/intelligence/adapter.rb +2 -2
  8. data/lib/intelligence/adapters/anthropic/adapter.rb +21 -19
  9. data/lib/intelligence/adapters/anthropic/chat_request_methods.rb +189 -0
  10. data/lib/intelligence/adapters/anthropic/{chat_methods.rb → chat_response_methods.rb} +13 -137
  11. data/lib/intelligence/adapters/cerebras.rb +19 -19
  12. data/lib/intelligence/adapters/generic/adapter.rb +4 -2
  13. data/lib/intelligence/adapters/generic/chat_request_methods.rb +221 -0
  14. data/lib/intelligence/adapters/generic/chat_response_methods.rb +234 -0
  15. data/lib/intelligence/adapters/generic.rb +1 -1
  16. data/lib/intelligence/adapters/google/adapter.rb +33 -22
  17. data/lib/intelligence/adapters/google/chat_request_methods.rb +234 -0
  18. data/lib/intelligence/adapters/google/chat_response_methods.rb +236 -0
  19. data/lib/intelligence/adapters/groq.rb +29 -49
  20. data/lib/intelligence/adapters/hyperbolic.rb +13 -39
  21. data/lib/intelligence/adapters/mistral.rb +21 -42
  22. data/lib/intelligence/adapters/open_ai/adapter.rb +39 -32
  23. data/lib/intelligence/adapters/open_ai/chat_request_methods.rb +186 -0
  24. data/lib/intelligence/adapters/open_ai/chat_response_methods.rb +239 -0
  25. data/lib/intelligence/adapters/open_ai.rb +1 -1
  26. data/lib/intelligence/adapters/open_router.rb +18 -18
  27. data/lib/intelligence/adapters/samba_nova.rb +16 -18
  28. data/lib/intelligence/adapters/together_ai.rb +25 -23
  29. data/lib/intelligence/conversation.rb +11 -10
  30. data/lib/intelligence/message.rb +45 -29
  31. data/lib/intelligence/message_content/base.rb +2 -9
  32. data/lib/intelligence/message_content/binary.rb +3 -3
  33. data/lib/intelligence/message_content/file.rb +3 -3
  34. data/lib/intelligence/message_content/text.rb +10 -2
  35. data/lib/intelligence/message_content/tool_call.rb +61 -5
  36. data/lib/intelligence/message_content/tool_result.rb +11 -6
  37. data/lib/intelligence/tool.rb +139 -0
  38. data/lib/intelligence/version.rb +1 -1
  39. data/lib/intelligence.rb +3 -1
  40. metadata +31 -13
  41. data/lib/intelligence/adapter/class_methods/construction.rb +0 -17
  42. data/lib/intelligence/adapter/module_methods/construction.rb +0 -43
  43. data/lib/intelligence/adapters/generic/chat_methods.rb +0 -355
  44. data/lib/intelligence/adapters/google/chat_methods.rb +0 -393
  45. data/lib/intelligence/adapters/legacy/adapter.rb +0 -11
  46. data/lib/intelligence/adapters/legacy/chat_methods.rb +0 -54
  47. data/lib/intelligence/adapters/open_ai/chat_methods.rb +0 -345
@@ -1,57 +1,36 @@
1
- require_relative 'legacy/adapter'
1
+ require_relative 'generic/adapter'
2
2
 
3
3
  module Intelligence
4
4
  module Mistral
5
-
6
- class Adapter < Legacy::Adapter
5
+ class Adapter < Generic::Adapter
7
6
 
8
7
  chat_request_uri "https://api.mistral.ai/v1/chat/completions"
9
8
 
10
- configuration do
11
- parameter :key, String
12
- group :chat_options do
13
- parameter :model, String
14
- parameter :temperature, Float
15
- parameter :top_p, Float
16
- parameter :max_tokens, Integer
17
- parameter :min_tokens, Integer
18
- parameter :seed, Integer, as: :random_seed
19
- parameter :stop, String, array: true
20
- parameter :stream, [ TrueClass, FalseClass ]
9
+ schema do
10
+ key String
11
+ chat_options do
12
+ model String
13
+ temperature Float
14
+ top_p Float
15
+ max_tokens Integer
16
+ min_tokens Integer
17
+ seed Integer, as: :random_seed
18
+ stop String, array: true
19
+ stream [ TrueClass, FalseClass ]
21
20
 
22
- parameter :random_seed, Integer
23
- group :response_format do
24
- parameter :type, String
21
+ random_seed Integer
22
+ response_format do
23
+ type String
25
24
  end
26
- group :tool_choice do
27
- parameter :type, String
28
- group :function do
29
- parameter :name, String
25
+ tool_choice do
26
+ type String
27
+ function do
28
+ name String
30
29
  end
31
30
  end
32
31
  end
33
32
  end
34
-
35
- alias chat_request_generic_message_attributes chat_request_message_attributes
36
-
37
- # mistral vision models only support the legacy Open AI message schema for the assistant
38
- # messages while supporting the modern message schema for user messages :facepalm:
39
- def chat_request_message_attributes( message )
40
- role = message[ :role ]&.to_sym
41
- case role
42
- when :user
43
- chat_request_generic_message_attributes( message )
44
- when :assistant
45
- chat_request_legacy_message_attributes( message )
46
- else
47
- raise UnsupportedContentError.new(
48
- :mistral,
49
- 'only supports user and assistant message roles'
50
- )
51
- end
52
- end
53
-
33
+
54
34
  end
55
-
56
35
  end
57
36
  end
@@ -1,60 +1,67 @@
1
- require_relative 'chat_methods'
1
+ require_relative 'chat_request_methods'
2
+ require_relative 'chat_response_methods'
2
3
 
3
4
  module Intelligence
4
5
  module OpenAi
5
6
  class Adapter < Adapter::Base
6
7
 
7
- configuration do
8
+ schema do
8
9
 
9
10
  # normalized properties for all endpoints
10
- parameter :key, String
11
+ key String
11
12
 
12
13
  # openai properties for all endpoints
13
- parameter :organization
14
- parameter :project
14
+ organization String
15
+ project String
15
16
 
16
17
  # properties for generative text endpoints
17
- group :chat_options do
18
+ chat_options do
18
19
 
19
20
  # normalized properties for openai generative text endpoint
20
- parameter :model, String
21
- parameter :n, Integer
22
- parameter :max_tokens, Integer, as: :max_completion_tokens
23
- parameter :temperature, Float
24
- parameter :top_p, Float
25
- parameter :seed, Integer
26
- parameter :stop, String, array: true
27
- parameter :stream, [ TrueClass, FalseClass ]
28
-
29
- parameter :frequency_penalty, Float
30
- parameter :presence_penalty, Float
21
+ model String, requried: true
22
+ n Integer
23
+ max_tokens Integer, as: :max_completion_tokens
24
+ temperature Float
25
+ top_p Float
26
+ seed Integer
27
+ stop String, array: true
28
+ stream [ TrueClass, FalseClass ]
29
+
30
+ frequency_penalty Float
31
+ presence_penalty Float
31
32
 
32
33
  # openai variant of normalized properties for openai generative text endpoints
33
- parameter :max_completion_tokens, Integer
34
+ max_completion_tokens Integer
34
35
 
35
36
  # openai properties for openai generative text endpoint
36
- parameter :logit_bias
37
- parameter :logprobs, [ TrueClass, FalseClass ]
38
- parameter :parallel_tool_calls, [ TrueClass, FalseClass ]
39
- group :response_format do
37
+ audio do
38
+ voice String
39
+ format String
40
+ end
41
+ logit_bias
42
+ logprobs [ TrueClass, FalseClass ]
43
+ modalities String, array: true
44
+ # the parallel_tool_calls parameter is only allowed when 'tools' are specified
45
+ parallel_tool_calls [ TrueClass, FalseClass ]
46
+ response_format do
40
47
  # 'text' and 'json_schema' are the only supported types
41
- parameter :type, String
42
- parameter :json_schema
48
+ type Symbol, in: [ :text, :json_schema ]
49
+ json_schema
43
50
  end
44
- parameter :service_tier, String
45
- group :stream_options do
46
- parameter :include_usage, [ TrueClass, FalseClass ]
51
+ service_tier String
52
+ stream_options do
53
+ include_usage [ TrueClass, FalseClass ]
47
54
  end
48
- parameter :tool_choice
49
- # the parallel_tool_calls parameter is only allowed when 'tools' are specified
50
- parameter :top_logprobs, Integer
51
- parameter :user
55
+ tool_choice
56
+ top_logprobs Integer
57
+ user
52
58
 
53
59
  end
54
60
 
55
61
  end
56
62
 
57
- include ChatMethods
63
+ include ChatRequestMethods
64
+ include ChatResponseMethods
58
65
 
59
66
  end
60
67
  end
@@ -0,0 +1,186 @@
1
+ module Intelligence
2
+ module OpenAi
3
+ module ChatRequestMethods
4
+
5
+ CHAT_REQUEST_URI = "https://api.openai.com/v1/chat/completions"
6
+
7
+ SUPPORTED_CONTENT_TYPES = [ 'image/jpeg', 'image/png' ]
8
+
9
+ def chat_request_uri( options )
10
+ CHAT_REQUEST_URI
11
+ end
12
+
13
+ def chat_request_headers( options = {} )
14
+ options = @options.merge( build_options( options ) )
15
+ result = {}
16
+
17
+ key = options[ :key ]
18
+ organization = options[ :organization ]
19
+ project = options[ :project ]
20
+
21
+ raise ArgumentError.new( "An OpenAI key is required to build an OpenAI chat request." ) \
22
+ if key.nil?
23
+
24
+ result[ 'Content-Type' ] = 'application/json'
25
+ result[ 'Authorization' ] = "Bearer #{key}"
26
+ result[ 'OpenAI-Organization' ] = organization unless organization.nil?
27
+ result[ 'OpenAI-Project' ] = project unless project.nil?
28
+
29
+ result
30
+ end
31
+
32
+ def chat_request_body( conversation, options = {} )
33
+ options = @options.merge( build_options( options ) )
34
+ result = options[ :chat_options ]&.compact || {}
35
+ result[ :messages ] = []
36
+
37
+ system_message = to_open_ai_system_message( conversation[ :system_message ] )
38
+ result[ :messages ] << { role: 'system', content: system_message } if system_message
39
+
40
+ conversation[ :messages ]&.each do | message |
41
+
42
+ result_message = { role: message[ :role ] }
43
+ result_message_content = []
44
+
45
+ message[ :contents ]&.each do | content |
46
+ case content[ :type ]
47
+ when :text
48
+ result_message_content << { type: 'text', text: content[ :text ] }
49
+ when :binary
50
+ content_type = content[ :content_type ]
51
+ bytes = content[ :bytes ]
52
+ if content_type && bytes
53
+ if SUPPORTED_CONTENT_TYPES.include?( content_type )
54
+ result_message_content << {
55
+ type: 'image_url',
56
+ image_url: {
57
+ url: "data:#{content_type};base64,#{Base64.strict_encode64( bytes )}".freeze
58
+ }
59
+ }
60
+ else
61
+ raise UnsupportedContentError.new(
62
+ :open_ai,
63
+ "only supports content of type #{SUPPORTED_CONTENT_TYPES.join( ', ' )}"
64
+ )
65
+ end
66
+ else
67
+ raise UnsupportedContentError.new(
68
+ :open_ai,
69
+ 'requires binary content to include content type and ( packed ) bytes'
70
+ )
71
+ end
72
+ when :file
73
+ content_type = content[ :content_type ]
74
+ uri = content[ :uri ]
75
+ if content_type && uri
76
+ if SUPPORTED_CONTENT_TYPES.include?( content_type )
77
+ result_message_content << {
78
+ type: 'image_url',
79
+ image_url: {
80
+ url: uri
81
+ }
82
+ }
83
+ else
84
+ raise UnsupportedContentError.new(
85
+ :open_ai,
86
+ "only supports content of type #{SUPPORTED_CONTENT_TYPES.join( ', ' )}"
87
+ )
88
+ end
89
+ else
90
+ raise UnsupportedContentError.new(
91
+ :open_ai,
92
+ 'requires file content to include content type and uri'
93
+ )
94
+ end
95
+ when :tool_call
96
+ tool_calls = result_message[ :tool_calls ] || []
97
+ function = {
98
+ name: content[ :tool_name ]
99
+ }
100
+ function[ :arguments ] = JSON.generate( content[ :tool_parameters ] || {} )
101
+ tool_calls << { id: content[ :tool_call_id ], type: 'function', function: function }
102
+ result_message[ :tool_calls ] = tool_calls
103
+ when :tool_result
104
+ # open-ai returns tool results as a message with a role of 'tool'
105
+ result[ :messages ] << {
106
+ role: :tool,
107
+ tool_call_id: content[ :tool_call_id ],
108
+ content: content[ :tool_result ]
109
+ }
110
+ else
111
+ raise InvalidContentError.new( :open_ai )
112
+ end
113
+
114
+ end
115
+
116
+ result_message[ :content ] = result_message_content
117
+ result[ :messages ] << result_message \
118
+ if result_message[ :content ]&.any? || result_message[ :tool_calls ]&.any?
119
+ result
120
+
121
+ end
122
+
123
+ tools_attributes = chat_request_tools_attributes( conversation[ :tools ] )
124
+ result[ :tools ] = tools_attributes if tools_attributes && tools_attributes.length > 0
125
+
126
+ JSON.generate( result )
127
+ end
128
+
129
+ def chat_request_tools_attributes( tools )
130
+ properties_array_to_object = lambda do | properties |
131
+ return nil unless properties&.any?
132
+ object = {}
133
+ required = []
134
+ properties.each do | property |
135
+ name = property.delete( :name )
136
+ required << name if property.delete( :required )
137
+ if property[ :properties ]&.any?
138
+ property_properties, property_required =
139
+ properties_array_to_object.call( property[ :properties ] )
140
+ property[ :properties ] = property_properties
141
+ property[ :required ] = property_required if property_required.any?
142
+ end
143
+ object[ name ] = property
144
+ end
145
+ [ object, required.compact ]
146
+ end
147
+
148
+ tools&.map do | tool |
149
+ function = {
150
+ type: 'function',
151
+ function: {
152
+ name: tool[ :name ],
153
+ description: tool[ :description ],
154
+ }
155
+ }
156
+
157
+ if tool[ :properties ]&.any?
158
+ properties_object, properties_required =
159
+ properties_array_to_object.call( tool[ :properties ] )
160
+ function[ :function ][ :parameters ] = {
161
+ type: 'object',
162
+ properties: properties_object
163
+ }
164
+ function[ :function ][ :parameters ][ :required ] = properties_required \
165
+ if properties_required.any?
166
+ end
167
+ function
168
+ end
169
+ end
170
+
171
+ private
172
+
173
+ def to_open_ai_system_message( system_message )
174
+ return nil if system_message.nil?
175
+
176
+ result = ''
177
+ system_message[ :contents ].each do | content |
178
+ result += content[ :text ] if content[ :type ] == :text
179
+ end
180
+
181
+ result.empty? ? nil : result
182
+ end
183
+
184
+ end
185
+ end
186
+ end
@@ -0,0 +1,239 @@
1
+ module Intelligence
2
+ module OpenAi
3
+ module ChatResponseMethods
4
+
5
+ def chat_result_attributes( response )
6
+ return nil unless response.success?
7
+ response_json = JSON.parse( response.body, symbolize_names: true ) rescue nil
8
+ return nil \
9
+ if response_json.nil? || response_json[ :choices ].nil?
10
+
11
+ result = {}
12
+ result[ :choices ] = []
13
+
14
+ ( response_json[ :choices ] || [] ).each do | json_choice |
15
+ json_message = json_choice[ :message ]
16
+ result_message = nil
17
+ if ( json_message )
18
+ result_message = { role: json_message[ :role ] }
19
+ if json_message[ :content ]
20
+ result_message[ :contents ] = [ { type: :text, text: json_message[ :content ] } ]
21
+ end
22
+ if json_message[ :tool_calls ] && !json_message[ :tool_calls ].empty?
23
+ result_message[ :contents ] ||= []
24
+ json_message[ :tool_calls ].each do | json_message_tool_call |
25
+ result_message_tool_call_parameters =
26
+ JSON.parse( json_message_tool_call[ :function ][ :arguments ], symbolize_names: true ) \
27
+ rescue json_message_tool_call[ :function ][ :arguments ]
28
+ result_message[ :contents ] << {
29
+ type: :tool_call,
30
+ tool_call_id: json_message_tool_call[ :id ],
31
+ tool_name: json_message_tool_call[ :function ][ :name ],
32
+ tool_parameters: result_message_tool_call_parameters
33
+ }
34
+ end
35
+ end
36
+ end
37
+ result[ :choices ].push( {
38
+ end_reason: translate_end_result( json_choice[ :finish_reason ] ),
39
+ message: result_message
40
+ } )
41
+ end
42
+
43
+ metrics_json = response_json[ :usage ]
44
+ unless metrics_json.nil?
45
+
46
+ metrics = {}
47
+ metrics[ :input_tokens ] = metrics_json[ :prompt_tokens ]
48
+ metrics[ :output_tokens ] = metrics_json[ :completion_tokens ]
49
+ metrics = metrics.compact
50
+
51
+ result[ :metrics ] = metrics unless metrics.empty?
52
+
53
+ end
54
+
55
+ result
56
+ end
57
+
58
+ def chat_result_error_attributes( response )
59
+ error_type, error_description = translate_error_response_status( response.status )
60
+ result = {
61
+ error_type: error_type.to_s,
62
+ error_description: error_description
63
+ }
64
+
65
+ parsed_body = JSON.parse( response.body, symbolize_names: true ) rescue nil
66
+ if parsed_body && parsed_body.respond_to?( :include? ) && parsed_body.include?( :error )
67
+ result = {
68
+ error_type: error_type.to_s,
69
+ error: parsed_body[ :error ][ :code ] || error_type.to_s,
70
+ error_description: parsed_body[ :error ][ :message ] || error_description
71
+ }
72
+ end
73
+
74
+ result
75
+ end
76
+
77
+ def stream_result_chunk_attributes( context, chunk )
78
+ context ||= {}
79
+ buffer = context[ :buffer ] || ''
80
+ metrics = context[ :metrics ] || {
81
+ input_tokens: 0,
82
+ output_tokens: 0
83
+ }
84
+ choices = context[ :choices ] || Array.new( 1 , { message: {} } )
85
+
86
+ choices.each do | choice |
87
+ choice[ :message ][ :contents ] = choice[ :message ][ :contents ]&.map do | content |
88
+ { type: content[ :type ] }
89
+ end
90
+ end
91
+
92
+ buffer += chunk
93
+ while ( eol_index = buffer.index( "\n" ) )
94
+ line = buffer.slice!( 0..eol_index )
95
+ line = line.strip
96
+ next if line.empty? || !line.start_with?( 'data:' )
97
+ line = line[ 6..-1 ]
98
+
99
+ next if line.end_with?( '[DONE]' )
100
+ data = JSON.parse( line ) rescue nil
101
+
102
+ if data.is_a?( Hash )
103
+ data[ 'choices' ]&.each do | data_choice |
104
+
105
+ data_choice_index = data_choice[ 'index' ]
106
+ data_choice_delta = data_choice[ 'delta' ]
107
+ data_choice_finish_reason = data_choice[ 'finish_reason' ]
108
+
109
+ choices.fill( { message: {} }, choices.size, data_choice_index + 1 ) \
110
+ if choices.size <= data_choice_index
111
+ contents = choices[ data_choice_index ][ :message ][ :contents ] || []
112
+
113
+ text_content = contents.first&.[]( :type ) == :text ? contents.first : nil
114
+ if data_choice_content = data_choice_delta[ 'content' ]
115
+ if text_content.nil?
116
+ contents.unshift( text_content = { type: :text, text: data_choice_content } )
117
+ else
118
+ text_content[ :text ] = ( text_content[ :text ] || '' ) + data_choice_content
119
+ end
120
+ end
121
+ if data_choice_tool_calls = data_choice_delta[ 'tool_calls' ]
122
+ data_choice_tool_calls.each do | data_choice_tool_call |
123
+ if data_choice_tool_call_function = data_choice_tool_call[ 'function' ]
124
+ data_choice_tool_index = data_choice_tool_call[ 'index' ]
125
+ data_choice_tool_id = data_choice_tool_call[ 'id' ]
126
+ data_choice_tool_name = data_choice_tool_call_function[ 'name' ]
127
+ data_choice_tool_parameters = data_choice_tool_call_function[ 'arguments' ]
128
+
129
+ tool_call_content_index = ( text_content.nil? ? 0 : 1 ) + data_choice_tool_index
130
+ if tool_call_content_index >= contents.length
131
+ contents.push( {
132
+ type: :tool_call,
133
+ tool_call_id: data_choice_tool_id,
134
+ tool_name: data_choice_tool_name,
135
+ tool_parameters: data_choice_tool_parameters
136
+ } )
137
+ else
138
+ tool_call = contents[ tool_call_content_index ]
139
+ tool_call[ :tool_call_id ] = ( tool_call[ :tool_call_id ] || '' ) + data_choice_tool_id \
140
+ if data_choice_tool_id
141
+ tool_call[ :tool_name ] = ( tool_call[ :tool_name ] || '' ) + data_choice_tool_name \
142
+ if data_choice_tool_name
143
+ tool_call[ :tool_parameters ] = ( tool_call[ :tool_parameters ] || '' ) + data_choice_tool_parameters \
144
+ if data_choice_tool_parameters
145
+ end
146
+ end
147
+ end
148
+ end
149
+ choices[ data_choice_index ][ :message ][ :contents ] = contents
150
+ choices[ data_choice_index ][ :end_reason ] ||=
151
+ translate_end_result( data_choice_finish_reason )
152
+ end
153
+
154
+ if usage = data[ 'usage' ]
155
+ metrics[ :input_tokens ] += usage[ 'prompt_tokens' ]
156
+ metrics[ :output_tokens ] += usage[ 'completion_tokens' ]
157
+ end
158
+
159
+ end
160
+
161
+ end
162
+
163
+ context[ :buffer ] = buffer
164
+ context[ :metrics ] = metrics
165
+ context[ :choices ] = choices
166
+
167
+ [ context, choices.empty? ? nil : { choices: choices.dup } ]
168
+ end
169
+
170
+ def stream_result_attributes( context )
171
+ choices = context[ :choices ]
172
+ metrics = context[ :metrics ]
173
+
174
+ choices = choices.map do | choice |
175
+ { end_reason: choice[ :end_reason ] }
176
+ end
177
+
178
+ { choices: choices, metrics: context[ :metrics ] }
179
+ end
180
+
181
+ alias_method :stream_result_error_attributes, :chat_result_error_attributes
182
+
183
+ private
184
+
185
+ def translate_end_result( end_result )
186
+ case end_result
187
+ when 'stop'
188
+ :ended
189
+ when 'length'
190
+ :token_limit_exceeded
191
+ when 'tool_calls'
192
+ :tool_called
193
+ when 'content_filter'
194
+ :filtered
195
+ else
196
+ nil
197
+ end
198
+ end
199
+
200
+ def translate_error_response_status( status )
201
+ case status
202
+ when 400
203
+ [ :invalid_request_error,
204
+ "There was an issue with the format or content of your request." ]
205
+ when 401
206
+ [ :authentication_error,
207
+ "There's an issue with your API key." ]
208
+ when 403
209
+ [ :permission_error,
210
+ "Your API key does not have permission to use the specified resource." ]
211
+ when 404
212
+ [ :not_found_error,
213
+ "The requested resource was not found." ]
214
+ when 413
215
+ [ :request_too_large,
216
+ "Request exceeds the maximum allowed number of bytes." ]
217
+ when 422
218
+ [ :invalid_request_error,
219
+ "There was an issue with the format or content of your request." ]
220
+ when 429
221
+ [ :rate_limit_error,
222
+ "Your account has hit a rate limit." ]
223
+ when 500, 502, 503
224
+ [ :api_error,
225
+ "An unexpected error has occurred internal to the providers systems." ]
226
+ when 529
227
+ [ :overloaded_error,
228
+ "The providers server is temporarily overloaded." ]
229
+ else
230
+ [ :unknown_error, "
231
+ An unknown error occurred." ]
232
+ end
233
+ end
234
+
235
+ end
236
+
237
+ end
238
+
239
+ end
@@ -1,2 +1,2 @@
1
1
  require_relative '../adapter'
2
- require_relative 'open_ai/adapter'
2
+ require_relative 'open_ai/adapter'
@@ -7,25 +7,25 @@ module Intelligence
7
7
 
8
8
  chat_request_uri "https://openrouter.ai/api/v1/chat/completions"
9
9
 
10
- configuration do
11
- parameter :key, String
12
- group :chat_options do
13
- parameter :model, String
14
- parameter :temperature, Float
15
- parameter :top_k, Integer
16
- parameter :top_p, Float
17
- parameter :max_tokens, Integer
18
- parameter :seed, Integer
19
- parameter :stop, String, array: true
20
- parameter :stream, [ TrueClass, FalseClass ]
21
- parameter :frequency_penalty, Float
22
- parameter :repetition_penalty, Float
23
- parameter :presence_penalty, Float
10
+ schema do
11
+ key String
12
+ chat_options do
13
+ model String
14
+ temperature Float
15
+ top_k Integer
16
+ top_p Float
17
+ max_tokens Integer
18
+ seed Integer
19
+ stop String, array: true
20
+ stream [ TrueClass, FalseClass ]
21
+ frequency_penalty Float
22
+ repetition_penalty Float
23
+ presence_penalty Float
24
24
 
25
- group :provider do
26
- parameter :order, String, array: true
27
- parameter :require_parameters, [ TrueClass, FalseClass ]
28
- parameter :allow_fallbacks, [ TrueClass, FalseClass ]
25
+ provider do
26
+ order String, array: true
27
+ require_parameters [ TrueClass, FalseClass ]
28
+ allow_fallbacks [ TrueClass, FalseClass ]
29
29
  end
30
30
  end
31
31
  end