activeagent 0.5.1 → 0.6.0rc1

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
@@ -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.1"
2
+ VERSION = "0.6.0rc1"
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.1
4
+ version: 0.6.0rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Bowen
@@ -16,9 +16,9 @@ dependencies:
16
16
  - - ">="
17
17
  - !ruby/object:Gem::Version
18
18
  version: '7.2'
19
- - - "<"
19
+ - - "<="
20
20
  - !ruby/object:Gem::Version
21
- version: '9.0'
21
+ version: 8.0.2.1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
@@ -26,9 +26,9 @@ dependencies:
26
26
  - - ">="
27
27
  - !ruby/object:Gem::Version
28
28
  version: '7.2'
29
- - - "<"
29
+ - - "<="
30
30
  - !ruby/object:Gem::Version
31
- version: '9.0'
31
+ version: 8.0.2.1
32
32
  - !ruby/object:Gem::Dependency
33
33
  name: actionview
34
34
  requirement: !ruby/object:Gem::Requirement
@@ -36,9 +36,9 @@ dependencies:
36
36
  - - ">="
37
37
  - !ruby/object:Gem::Version
38
38
  version: '7.2'
39
- - - "<"
39
+ - - "<="
40
40
  - !ruby/object:Gem::Version
41
- version: '9.0'
41
+ version: 8.0.2.1
42
42
  type: :runtime
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
@@ -46,9 +46,9 @@ dependencies:
46
46
  - - ">="
47
47
  - !ruby/object:Gem::Version
48
48
  version: '7.2'
49
- - - "<"
49
+ - - "<="
50
50
  - !ruby/object:Gem::Version
51
- version: '9.0'
51
+ version: 8.0.2.1
52
52
  - !ruby/object:Gem::Dependency
53
53
  name: activesupport
54
54
  requirement: !ruby/object:Gem::Requirement
@@ -56,9 +56,9 @@ dependencies:
56
56
  - - ">="
57
57
  - !ruby/object:Gem::Version
58
58
  version: '7.2'
59
- - - "<"
59
+ - - "<="
60
60
  - !ruby/object:Gem::Version
61
- version: '9.0'
61
+ version: 8.0.2.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
@@ -66,9 +66,9 @@ dependencies:
66
66
  - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '7.2'
69
- - - "<"
69
+ - - "<="
70
70
  - !ruby/object:Gem::Version
71
- version: '9.0'
71
+ version: 8.0.2.1
72
72
  - !ruby/object:Gem::Dependency
73
73
  name: activemodel
74
74
  requirement: !ruby/object:Gem::Requirement
@@ -76,9 +76,9 @@ dependencies:
76
76
  - - ">="
77
77
  - !ruby/object:Gem::Version
78
78
  version: '7.2'
79
- - - "<"
79
+ - - "<="
80
80
  - !ruby/object:Gem::Version
81
- version: '9.0'
81
+ version: 8.0.2.1
82
82
  type: :runtime
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
@@ -86,9 +86,9 @@ dependencies:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
88
  version: '7.2'
89
- - - "<"
89
+ - - "<="
90
90
  - !ruby/object:Gem::Version
91
- version: '9.0'
91
+ version: 8.0.2.1
92
92
  - !ruby/object:Gem::Dependency
93
93
  name: activejob
94
94
  requirement: !ruby/object:Gem::Requirement
@@ -96,9 +96,9 @@ dependencies:
96
96
  - - ">="
97
97
  - !ruby/object:Gem::Version
98
98
  version: '7.2'
99
- - - "<"
99
+ - - "<="
100
100
  - !ruby/object:Gem::Version
101
- version: '9.0'
101
+ version: 8.0.2.1
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -106,37 +106,37 @@ dependencies:
106
106
  - - ">="
107
107
  - !ruby/object:Gem::Version
108
108
  version: '7.2'
109
- - - "<"
109
+ - - "<="
110
110
  - !ruby/object:Gem::Version
111
- version: '9.0'
111
+ version: 8.0.2.1
112
112
  - !ruby/object:Gem::Dependency
113
113
  name: jbuilder
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: 2.14.1
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0'
125
+ version: 2.14.1
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: rails
128
128
  requirement: !ruby/object:Gem::Requirement
129
129
  requirements:
130
- - - ">="
130
+ - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '0'
132
+ version: 8.0.2.1
133
133
  type: :development
134
134
  prerelease: false
135
135
  version_requirements: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - ">="
137
+ - - "~>"
138
138
  - !ruby/object:Gem::Version
139
- version: '0'
139
+ version: 8.0.2.1
140
140
  description: The only agent-oriented AI framework designed for Rails, where Agents
141
141
  are Controllers. Build AI features with less complexity using the MVC conventions
142
142
  you love.
@@ -157,6 +157,7 @@ files:
157
157
  - lib/active_agent/base.rb
158
158
  - lib/active_agent/callbacks.rb
159
159
  - lib/active_agent/collector.rb
160
+ - lib/active_agent/configuration.rb
160
161
  - lib/active_agent/deprecator.rb
161
162
  - lib/active_agent/generation.rb
162
163
  - lib/active_agent/generation_job.rb
@@ -164,11 +165,17 @@ files:
164
165
  - lib/active_agent/generation_provider/anthropic_provider.rb
165
166
  - lib/active_agent/generation_provider/base.rb
166
167
  - lib/active_agent/generation_provider/base_adapter.rb
168
+ - lib/active_agent/generation_provider/error_handling.rb
169
+ - lib/active_agent/generation_provider/log_subscriber.rb
170
+ - lib/active_agent/generation_provider/message_formatting.rb
167
171
  - lib/active_agent/generation_provider/ollama_provider.rb
168
172
  - lib/active_agent/generation_provider/open_ai_provider.rb
169
173
  - lib/active_agent/generation_provider/open_router_provider.rb
174
+ - lib/active_agent/generation_provider/parameter_builder.rb
170
175
  - lib/active_agent/generation_provider/response.rb
171
176
  - lib/active_agent/generation_provider/responses_adapter.rb
177
+ - lib/active_agent/generation_provider/stream_processing.rb
178
+ - lib/active_agent/generation_provider/tool_management.rb
172
179
  - lib/active_agent/inline_preview_interceptor.rb
173
180
  - lib/active_agent/log_subscriber.rb
174
181
  - lib/active_agent/parameterized.rb
@@ -177,6 +184,7 @@ files:
177
184
  - lib/active_agent/queued_generation.rb
178
185
  - lib/active_agent/railtie.rb
179
186
  - lib/active_agent/rescuable.rb
187
+ - lib/active_agent/sanitizers.rb
180
188
  - lib/active_agent/service.rb
181
189
  - lib/active_agent/test_case.rb
182
190
  - lib/active_agent/version.rb
@@ -190,6 +198,7 @@ files:
190
198
  - lib/generators/active_agent/templates/application_agent.rb.tt
191
199
  - lib/generators/erb/agent_generator.rb
192
200
  - lib/generators/erb/install_generator.rb
201
+ - lib/generators/erb/templates/instructions.text.erb.tt
193
202
  - lib/generators/erb/templates/layout.html.erb.tt
194
203
  - lib/generators/erb/templates/layout.json.erb.tt
195
204
  - lib/generators/erb/templates/layout.text.erb.tt