activeagent 0.5.0 → 0.6.0rc2

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.
@@ -20,25 +20,25 @@
20
20
  # end
21
21
  # end
22
22
 
23
- # debug { event.payload[:mail] }
23
+ # debug { event.payload[:prompt] }
24
24
  # end
25
25
  # subscribe_log_level :deliver, :debug
26
26
 
27
- # # An email was generated.
27
+ # # A prompt was rendered.
28
28
  # def process(event)
29
29
  # debug do
30
30
  # agent = event.payload[:agent]
31
31
  # action = event.payload[:action]
32
- # "#{agent}##{action}: processed outbound mail in #{event.duration.round(1)}ms"
32
+ # "#{agent}##{action}: processed outbound prompt in #{event.duration.round(1)}ms"
33
33
  # end
34
34
  # end
35
35
  # subscribe_log_level :process, :debug
36
36
 
37
- # # Use the logger configured for ActionMailer::Base.
37
+ # # Use the logger configured for ActiveAgent::Base.
38
38
  # def logger
39
- # ActionMailer::Base.logger
39
+ # ActiveAgent::Base.logger
40
40
  # end
41
41
  # end
42
42
  # end
43
43
 
44
- # ActionMailer::LogSubscriber.attach_to :action_mailer
44
+ # ActiveAgent::LogSubscriber.attach_to :active_agent
@@ -24,6 +24,7 @@ module ActiveAgent
24
24
 
25
25
  ActiveAgent::Parameterized::Agent.new(self, params)
26
26
  end
27
+ alias_method :prompt_with, :with
27
28
  end
28
29
 
29
30
  class Agent
@@ -68,7 +68,13 @@ module ActiveAgent
68
68
 
69
69
  initializer "active_agent.compile_config_methods" do
70
70
  ActiveSupport.on_load(:active_agent) do
71
- config.compile_methods! if config.respond_to?(:compile_methods!)
71
+ config.compile_methods! if config.class.respond_to?(:compile_methods!)
72
+ end
73
+ end
74
+
75
+ initializer "active_agent.inflections" do
76
+ ActiveSupport::Inflector.inflections do |inflect|
77
+ inflect.acronym "AI"
72
78
  end
73
79
  end
74
80
 
@@ -0,0 +1,40 @@
1
+ module ActiveAgent
2
+ module Sanitizers
3
+ extend ActiveSupport::Concern
4
+
5
+ SECRETS_KEYS = %w[access_token api_key]
6
+
7
+ class_methods do
8
+ # @return [Hash] The current sanitizers.
9
+ def sanitizers
10
+ @sanitizers ||= begin
11
+ sanitizers = {}
12
+
13
+ config.each do |provider, credentials|
14
+ credentials.slice(*SECRETS_KEYS).compact.each do |name, secret|
15
+ next if secret.blank?
16
+
17
+ sanitizers[secret] = "<#{provider.upcase}_#{name.upcase}>"
18
+ end
19
+ end
20
+
21
+ sanitizers
22
+ end
23
+ end
24
+
25
+ # return [void]
26
+ def sanitizers_reset!
27
+ @sanitizers = nil
28
+ end
29
+
30
+ # @return [String] The sanitized string with sensitive data replaced by placeholders.
31
+ def sanitize_credentials(string)
32
+ sanitizers.each do |secret, placeholder|
33
+ string = string.gsub(secret, placeholder)
34
+ end
35
+
36
+ string
37
+ end
38
+ end
39
+ end
40
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveAgent
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0rc2"
3
3
  end
data/lib/active_agent.rb CHANGED
@@ -1,9 +1,11 @@
1
1
  require "yaml"
2
2
  require "abstract_controller"
3
+ require "active_agent/configuration"
3
4
  require "active_agent/generation_provider"
4
5
  require "active_agent/version"
5
6
  require "active_agent/deprecator"
6
7
  require "active_agent/railtie" if defined?(Rails)
8
+ require "active_agent/sanitizers"
7
9
 
8
10
  require "active_support"
9
11
  require "active_support/rails"
@@ -12,6 +14,7 @@ require "active_support/core_ext/module/attr_internal"
12
14
  require "active_support/core_ext/string/inflections"
13
15
  require "active_support/lazy_load_hooks"
14
16
  module ActiveAgent
17
+ include ActiveAgent::Sanitizers
15
18
  extend ActiveSupport::Autoload
16
19
 
17
20
  eager_autoload do
@@ -23,7 +26,6 @@ module ActiveAgent
23
26
  autoload :InlinePreviewInterceptor
24
27
  autoload :PromptHelper
25
28
  autoload :Generation
26
- autoload :GenerationMethods
27
29
  autoload :GenerationProvider
28
30
  autoload :QueuedGeneration
29
31
  autoload :Parameterized
@@ -34,11 +36,6 @@ module ActiveAgent
34
36
  class << self
35
37
  attr_accessor :config
36
38
 
37
- def filter_credential_keys(example)
38
- example.gsub(Rails.application.credentials.dig(:openai, :api_key), "<OPENAI_API_KEY>")
39
- .gsub(Rails.application.credentials.dig(:open_router, :api_key), "<OPEN_ROUTER_API_KEY>")
40
- end
41
-
42
39
  def eager_load!
43
40
  super
44
41
 
@@ -47,10 +44,14 @@ module ActiveAgent
47
44
  end
48
45
  end
49
46
 
47
+ # @return [void]
50
48
  def configure
51
49
  yield self
50
+
51
+ sanitizers_reset!
52
52
  end
53
53
 
54
+ # @return [void]
54
55
  def load_configuration(file)
55
56
  if File.exist?(file)
56
57
  config_file = YAML.load(ERB.new(File.read(file)).result, aliases: true)
@@ -59,6 +60,8 @@ module ActiveAgent
59
60
  else
60
61
  @config = {}
61
62
  end
63
+
64
+ sanitizers_reset!
62
65
  end
63
66
  end
64
67
  end
@@ -20,6 +20,9 @@ module Erb # :nodoc:
20
20
  end
21
21
  end
22
22
 
23
+ instructions_path = File.join(view_base_path, "instructions.text.erb")
24
+ template "instructions.text.erb.tt", instructions_path
25
+
23
26
  actions.each do |action|
24
27
  @action = action
25
28
 
@@ -0,0 +1 @@
1
+ Instructions for an AI agent
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeagent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Bowen
@@ -16,7 +16,7 @@ dependencies:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '7.2'
19
- - - "<"
19
+ - - "<="
20
20
  - !ruby/object:Gem::Version
21
21
  version: '9.0'
22
22
  type: :runtime
@@ -26,7 +26,7 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '7.2'
29
- - - "<"
29
+ - - "<="
30
30
  - !ruby/object:Gem::Version
31
31
  version: '9.0'
32
32
  - !ruby/object:Gem::Dependency
@@ -36,7 +36,7 @@ dependencies:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
38
  version: '7.2'
39
- - - "<"
39
+ - - "<="
40
40
  - !ruby/object:Gem::Version
41
41
  version: '9.0'
42
42
  type: :runtime
@@ -46,7 +46,7 @@ dependencies:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '7.2'
49
- - - "<"
49
+ - - "<="
50
50
  - !ruby/object:Gem::Version
51
51
  version: '9.0'
52
52
  - !ruby/object:Gem::Dependency
@@ -56,7 +56,7 @@ dependencies:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '7.2'
59
- - - "<"
59
+ - - "<="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '9.0'
62
62
  type: :runtime
@@ -66,7 +66,7 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '7.2'
69
- - - "<"
69
+ - - "<="
70
70
  - !ruby/object:Gem::Version
71
71
  version: '9.0'
72
72
  - !ruby/object:Gem::Dependency
@@ -76,7 +76,7 @@ dependencies:
76
76
  - - ">="
77
77
  - !ruby/object:Gem::Version
78
78
  version: '7.2'
79
- - - "<"
79
+ - - "<="
80
80
  - !ruby/object:Gem::Version
81
81
  version: '9.0'
82
82
  type: :runtime
@@ -86,7 +86,7 @@ dependencies:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '7.2'
89
- - - "<"
89
+ - - "<="
90
90
  - !ruby/object:Gem::Version
91
91
  version: '9.0'
92
92
  - !ruby/object:Gem::Dependency
@@ -96,7 +96,7 @@ dependencies:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
98
  version: '7.2'
99
- - - "<"
99
+ - - "<="
100
100
  - !ruby/object:Gem::Version
101
101
  version: '9.0'
102
102
  type: :runtime
@@ -106,11 +106,25 @@ dependencies:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: '7.2'
109
- - - "<"
109
+ - - "<="
110
110
  - !ruby/object:Gem::Version
111
111
  version: '9.0'
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: jbuilder
114
+ requirement: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - "~>"
117
+ - !ruby/object:Gem::Version
118
+ version: '2.14'
119
+ type: :development
120
+ prerelease: false
121
+ version_requirements: !ruby/object:Gem::Requirement
122
+ requirements:
123
+ - - "~>"
124
+ - !ruby/object:Gem::Version
125
+ version: '2.14'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rails
114
128
  requirement: !ruby/object:Gem::Requirement
115
129
  requirements:
116
130
  - - ">="
@@ -124,7 +138,105 @@ dependencies:
124
138
  - !ruby/object:Gem::Version
125
139
  version: '0'
126
140
  - !ruby/object:Gem::Dependency
127
- name: rails
141
+ name: ruby-openai
142
+ requirement: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - "~>"
145
+ - !ruby/object:Gem::Version
146
+ version: 8.2.0
147
+ type: :development
148
+ prerelease: false
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - "~>"
152
+ - !ruby/object:Gem::Version
153
+ version: 8.2.0
154
+ - !ruby/object:Gem::Dependency
155
+ name: ruby-anthropic
156
+ requirement: !ruby/object:Gem::Requirement
157
+ requirements:
158
+ - - "~>"
159
+ - !ruby/object:Gem::Version
160
+ version: 0.4.2
161
+ type: :development
162
+ prerelease: false
163
+ version_requirements: !ruby/object:Gem::Requirement
164
+ requirements:
165
+ - - "~>"
166
+ - !ruby/object:Gem::Version
167
+ version: 0.4.2
168
+ - !ruby/object:Gem::Dependency
169
+ name: standard
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - ">="
180
+ - !ruby/object:Gem::Version
181
+ version: '0'
182
+ - !ruby/object:Gem::Dependency
183
+ name: rubocop-rails-omakase
184
+ requirement: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: '0'
189
+ type: :development
190
+ prerelease: false
191
+ version_requirements: !ruby/object:Gem::Requirement
192
+ requirements:
193
+ - - ">="
194
+ - !ruby/object:Gem::Version
195
+ version: '0'
196
+ - !ruby/object:Gem::Dependency
197
+ name: puma
198
+ requirement: !ruby/object:Gem::Requirement
199
+ requirements:
200
+ - - ">="
201
+ - !ruby/object:Gem::Version
202
+ version: '0'
203
+ type: :development
204
+ prerelease: false
205
+ version_requirements: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ - !ruby/object:Gem::Dependency
211
+ name: sqlite3
212
+ requirement: !ruby/object:Gem::Requirement
213
+ requirements:
214
+ - - ">="
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ type: :development
218
+ prerelease: false
219
+ version_requirements: !ruby/object:Gem::Requirement
220
+ requirements:
221
+ - - ">="
222
+ - !ruby/object:Gem::Version
223
+ version: '0'
224
+ - !ruby/object:Gem::Dependency
225
+ name: vcr
226
+ requirement: !ruby/object:Gem::Requirement
227
+ requirements:
228
+ - - ">="
229
+ - !ruby/object:Gem::Version
230
+ version: '0'
231
+ type: :development
232
+ prerelease: false
233
+ version_requirements: !ruby/object:Gem::Requirement
234
+ requirements:
235
+ - - ">="
236
+ - !ruby/object:Gem::Version
237
+ version: '0'
238
+ - !ruby/object:Gem::Dependency
239
+ name: webmock
128
240
  requirement: !ruby/object:Gem::Requirement
129
241
  requirements:
130
242
  - - ">="
@@ -157,6 +269,7 @@ files:
157
269
  - lib/active_agent/base.rb
158
270
  - lib/active_agent/callbacks.rb
159
271
  - lib/active_agent/collector.rb
272
+ - lib/active_agent/configuration.rb
160
273
  - lib/active_agent/deprecator.rb
161
274
  - lib/active_agent/generation.rb
162
275
  - lib/active_agent/generation_job.rb
@@ -164,11 +277,17 @@ files:
164
277
  - lib/active_agent/generation_provider/anthropic_provider.rb
165
278
  - lib/active_agent/generation_provider/base.rb
166
279
  - lib/active_agent/generation_provider/base_adapter.rb
280
+ - lib/active_agent/generation_provider/error_handling.rb
281
+ - lib/active_agent/generation_provider/log_subscriber.rb
282
+ - lib/active_agent/generation_provider/message_formatting.rb
167
283
  - lib/active_agent/generation_provider/ollama_provider.rb
168
284
  - lib/active_agent/generation_provider/open_ai_provider.rb
169
285
  - lib/active_agent/generation_provider/open_router_provider.rb
286
+ - lib/active_agent/generation_provider/parameter_builder.rb
170
287
  - lib/active_agent/generation_provider/response.rb
171
288
  - lib/active_agent/generation_provider/responses_adapter.rb
289
+ - lib/active_agent/generation_provider/stream_processing.rb
290
+ - lib/active_agent/generation_provider/tool_management.rb
172
291
  - lib/active_agent/inline_preview_interceptor.rb
173
292
  - lib/active_agent/log_subscriber.rb
174
293
  - lib/active_agent/parameterized.rb
@@ -177,6 +296,7 @@ files:
177
296
  - lib/active_agent/queued_generation.rb
178
297
  - lib/active_agent/railtie.rb
179
298
  - lib/active_agent/rescuable.rb
299
+ - lib/active_agent/sanitizers.rb
180
300
  - lib/active_agent/service.rb
181
301
  - lib/active_agent/test_case.rb
182
302
  - lib/active_agent/version.rb
@@ -190,6 +310,7 @@ files:
190
310
  - lib/generators/active_agent/templates/application_agent.rb.tt
191
311
  - lib/generators/erb/agent_generator.rb
192
312
  - lib/generators/erb/install_generator.rb
313
+ - lib/generators/erb/templates/instructions.text.erb.tt
193
314
  - lib/generators/erb/templates/layout.html.erb.tt
194
315
  - lib/generators/erb/templates/layout.json.erb.tt
195
316
  - lib/generators/erb/templates/layout.text.erb.tt