activeagent 0.0.0 → 0.1.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.
Files changed (44) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +153 -0
  3. data/Rakefile +3 -0
  4. data/lib/active_agent/README.md +21 -0
  5. data/lib/active_agent/action_prompt/README.md +44 -0
  6. data/lib/active_agent/action_prompt/base.rb +0 -0
  7. data/lib/active_agent/action_prompt/collector.rb +34 -0
  8. data/lib/active_agent/action_prompt/message.rb +44 -0
  9. data/lib/active_agent/action_prompt/prompt.rb +79 -0
  10. data/lib/active_agent/action_prompt.rb +127 -0
  11. data/lib/active_agent/base.rb +439 -0
  12. data/lib/active_agent/callbacks.rb +31 -0
  13. data/lib/active_agent/deprecator.rb +7 -0
  14. data/lib/active_agent/engine.rb +14 -0
  15. data/lib/active_agent/generation.rb +78 -0
  16. data/lib/active_agent/generation_job.rb +47 -0
  17. data/lib/active_agent/generation_methods.rb +60 -0
  18. data/lib/active_agent/generation_provider/README.md +17 -0
  19. data/lib/active_agent/generation_provider/base.rb +36 -0
  20. data/lib/active_agent/generation_provider/open_ai_provider.rb +68 -0
  21. data/lib/active_agent/generation_provider/response.rb +15 -0
  22. data/lib/active_agent/generation_provider.rb +63 -0
  23. data/lib/active_agent/inline_preview_interceptor.rb +60 -0
  24. data/lib/active_agent/log_subscriber.rb +44 -0
  25. data/lib/active_agent/operation.rb +13 -0
  26. data/lib/active_agent/parameterized.rb +66 -0
  27. data/lib/active_agent/preview.rb +133 -0
  28. data/lib/active_agent/prompt_helper.rb +19 -0
  29. data/lib/active_agent/queued_generation.rb +12 -0
  30. data/lib/active_agent/railtie.rb +89 -0
  31. data/lib/active_agent/rescuable.rb +34 -0
  32. data/lib/active_agent/service.rb +25 -0
  33. data/lib/active_agent/test_case.rb +125 -0
  34. data/lib/active_agent/version.rb +3 -0
  35. data/lib/active_agent.rb +63 -0
  36. data/lib/generators/active_agent/USAGE +18 -0
  37. data/lib/generators/active_agent/agent_generator.rb +63 -0
  38. data/lib/generators/active_agent/templates/action.html.erb.tt +0 -0
  39. data/lib/generators/active_agent/templates/action.json.jbuilder.tt +33 -0
  40. data/lib/generators/active_agent/templates/agent.rb.tt +14 -0
  41. data/lib/generators/active_agent/templates/agent_spec.rb.tt +0 -0
  42. data/lib/generators/active_agent/templates/agent_test.rb.tt +0 -0
  43. data/lib/generators/active_agent/templates/application_agent.rb.tt +4 -0
  44. metadata +129 -4
@@ -0,0 +1,125 @@
1
+ # # frozen_string_literal: true
2
+
3
+ # require_relative "test_helper"
4
+ # require "active_support/test_case"
5
+ # require "rails-dom-testing"
6
+
7
+ # module ActiveAgent
8
+ # class NonInferrableAgentError < ::StandardError
9
+ # def initialize(name)
10
+ # super("Unable to determine the agent to test from #{name}. " \
11
+ # "You'll need to specify it using tests YourAgent in your " \
12
+ # "test case definition")
13
+ # end
14
+ # end
15
+
16
+ # class TestCase < ActiveSupport::TestCase
17
+ # module ClearTestDeliveries
18
+ # extend ActiveSupport::Concern
19
+
20
+ # included do
21
+ # setup :clear_test_generations
22
+ # teardown :clear_test_generations
23
+ # end
24
+
25
+ # private
26
+
27
+ # def clear_test_generations
28
+ # if ActiveAgent::Base.generation_method == :test
29
+ # ActiveAgent::Base.generations.clear
30
+ # end
31
+ # end
32
+ # end
33
+
34
+ # module Behavior
35
+ # extend ActiveSupport::Concern
36
+
37
+ # include ActiveSupport::Testing::ConstantLookup
38
+ # include TestHelper
39
+ # include Rails::Dom::Testing::Assertions::SelectorAssertions
40
+ # include Rails::Dom::Testing::Assertions::DomAssertions
41
+
42
+ # included do
43
+ # class_attribute :_agent_class
44
+ # setup :initialize_test_generations
45
+ # setup :set_expected_prompt
46
+ # teardown :restore_test_generations
47
+ # ActiveSupport.run_load_hooks(:active_agent_test_case, self)
48
+ # end
49
+
50
+ # module ClassMethods
51
+ # def tests(agent)
52
+ # case agent
53
+ # when String, Symbol
54
+ # self._agent_class = agent.to_s.camelize.constantize
55
+ # when Module
56
+ # self._agent_class = agent
57
+ # else
58
+ # raise NonInferrableAgentError.new(agent)
59
+ # end
60
+ # end
61
+
62
+ # def agent_class
63
+ # if agent = _agent_class
64
+ # agent
65
+ # else
66
+ # tests determine_default_agent(name)
67
+ # end
68
+ # end
69
+
70
+ # def determine_default_agent(name)
71
+ # agent = determine_constant_from_test_name(name) do |constant|
72
+ # Class === constant && constant < ActiveAgent::Base
73
+ # end
74
+ # raise NonInferrableAgentError.new(name) if agent.nil?
75
+ # agent
76
+ # end
77
+ # end
78
+
79
+ # # Reads the fixture file for the given agent.
80
+ # #
81
+ # # This is useful when testing agents by being able to write the body of
82
+ # # an promt inside a fixture. See the testing guide for a concrete example:
83
+ # # https://guides.rubyonrails.org/testing.html#revenge-of-the-fixtures
84
+ # def read_fixture(action)
85
+ # IO.readlines(File.join(Rails.root, "test", "fixtures", self.class.agent_class.name.underscore, action))
86
+ # end
87
+
88
+ # private
89
+
90
+ # def initialize_test_generations
91
+ # set_generation_method :test
92
+ # @old_perform_generations = ActiveAgent::Base.perform_generations
93
+ # ActiveAgent::Base.perform_generations = true
94
+ # ActiveAgent::Base.generations.clear
95
+ # end
96
+
97
+ # def restore_test_generations
98
+ # restore_generation_method
99
+ # ActiveAgent::Base.perform_generations = @old_perform_generations
100
+ # end
101
+
102
+ # def set_generation_method(method)
103
+ # @old_generation_method = ActiveAgent::Base.generation_method
104
+ # ActiveAgent::Base.generation_method = method
105
+ # end
106
+
107
+ # def restore_generation_method
108
+ # ActiveAgent::Base.generations.clear
109
+ # ActiveAgent::Base.generation_method = @old_generation_method
110
+ # end
111
+
112
+ # def set_expected_prompt
113
+ # @expected = ActiveAgent::ActionPrompt::Prompt.new
114
+ # @expected.content_type ["text", "plain", {"charset" => charset}]
115
+ # @expected.mime_version = "1.0"
116
+ # end
117
+
118
+ # def charset
119
+ # "UTF-8"
120
+ # end
121
+ # end
122
+
123
+ # include Behavior
124
+ # end
125
+ # end
@@ -0,0 +1,3 @@
1
+ module ActiveAgent
2
+ VERSION = "0.1.0"
3
+ end
data/lib/active_agent.rb CHANGED
@@ -0,0 +1,63 @@
1
+ require "yaml"
2
+ require "abstract_controller"
3
+ require "active_agent/version"
4
+ require "active_agent/deprecator"
5
+ require "active_agent/railtie" if defined?(Rails)
6
+
7
+ require "active_support"
8
+ require "active_support/rails"
9
+ require "active_support/core_ext/class"
10
+ require "active_support/core_ext/module/attr_internal"
11
+ require "active_support/core_ext/string/inflections"
12
+ require "active_support/lazy_load_hooks"
13
+
14
+ module ActiveAgent
15
+ extend ActiveSupport::Autoload
16
+
17
+ eager_autoload do
18
+ autoload :Collector
19
+ end
20
+
21
+ autoload :Base
22
+ autoload :Callbacks
23
+ autoload :InlinePreviewInterceptor
24
+ autoload :PromptHelper
25
+ autoload :Generation
26
+ autoload :GenerationMethods
27
+ autoload :GenerationProvider
28
+ autoload :QueuedGeneration
29
+ autoload :Parameterized
30
+ autoload :Preview
31
+ autoload :Previews, "active_agent/preview"
32
+ autoload :GenerationJob
33
+
34
+ class << self
35
+ attr_accessor :config
36
+
37
+ def eager_load!
38
+ super
39
+
40
+ Base.descendants.each do |agent|
41
+ agent.eager_load! unless agent.abstract?
42
+ end
43
+ end
44
+
45
+ def configure
46
+ yield self
47
+ end
48
+
49
+ def load_configuration(file)
50
+ config_file = YAML.load_file(file, aliases: true)
51
+ env = ENV["RAILS_ENV"] || ENV["ENV"] || "development"
52
+ @config = config_file[env] || config_file
53
+ end
54
+ end
55
+ end
56
+
57
+ autoload :Mime, "action_dispatch/http/mime_type"
58
+
59
+ ActiveSupport.on_load(:action_view) do
60
+ ActionView::Base.default_formats ||= Mime::SET.symbols
61
+ ActionView::Template.mime_types_implementation = Mime
62
+ ActionView::LookupContext::DetailsKey.clear
63
+ end
@@ -0,0 +1,18 @@
1
+ Description:
2
+ Generates a new agent and its views. Passes the agent name, either
3
+ CamelCased or under_scored, and an optional list of prompts as arguments.
4
+
5
+ This generates a agent class in app/agents and invokes your template
6
+ engine and test framework generators.
7
+
8
+ Examples:
9
+ `bin/rails generate agent inventory search`
10
+
11
+ creates a sign up mailer class, views, and test:
12
+ Agent: app/agents/inventory_agent.rb
13
+ Views: app/views/inventory_agent/search.text.erb [...]
14
+ Test: test/agents/inventory_agent_test.rb
15
+
16
+ `bin/rails generate agent inventory search update report`
17
+
18
+ creates an inventory agent with search, update, and report actions.
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveAgent
4
+ module Generators
5
+ class AgentGenerator < ::Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ argument :actions, type: :array, default: [], banner: "method method"
9
+
10
+ check_class_collision suffix: "Agent"
11
+
12
+ def create_agent_file
13
+ template "agent.rb", File.join("app/agents", class_path, "#{file_name}_agent.rb")
14
+
15
+ in_root do
16
+ if behavior == :invoke && !File.exist?(application_agent_file_name)
17
+ template "application_agent.rb", application_agent_file_name
18
+ end
19
+ end
20
+ end
21
+
22
+ def create_test_file
23
+ if test_framework == :rspec
24
+ template "agent_spec.rb", File.join("spec/agents", class_path, "#{file_name}_agent_spec.rb")
25
+ else
26
+ template "agent_test.rb", File.join("test/agents", class_path, "#{file_name}_agent_test.rb")
27
+ end
28
+ end
29
+
30
+ def create_view_files
31
+ actions.each do |action|
32
+ @action = action
33
+ @schema_path = File.join("app/views", class_path, file_name, "#{action}.json.jbuilder")
34
+ @view_path = File.join("app/views", class_path, file_name, "#{action}.html.#{template_engine}")
35
+ template "action.json.jbuilder", @schema_path
36
+ template "action.html.#{template_engine}", @view_path
37
+ end
38
+ end
39
+
40
+
41
+ private
42
+ def test_framework
43
+ ::Rails.application.config.generators.options[:rails][:test_framework]
44
+ end
45
+
46
+ def template_engine
47
+ ::Rails.application.config.generators.options[:rails][:template_engine]
48
+ end
49
+
50
+ def file_name # :doc:
51
+ @_file_name ||= super + "_agent"
52
+ end
53
+
54
+ def application_agent_file_name
55
+ @_application_agent_file_name ||= if mountable_engine?
56
+ "app/agents/#{namespaced_path}/application_agent.rb"
57
+ else
58
+ "app/agents/application_agent.rb"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,33 @@
1
+ json.schema do
2
+ json.type "object"
3
+ json.properties do
4
+ json.name do
5
+ json.type "string"
6
+ json.description "The name of the function or tool"
7
+ end
8
+ json.description do
9
+ json.type "string"
10
+ json.description "A brief description of what the function or tool does"
11
+ end
12
+ json.parameters do
13
+ json.type "object"
14
+ json.properties do
15
+ json.each do |parameter|
16
+ json.name do
17
+ json.type "string"
18
+ json.description "The name of the parameter"
19
+ end
20
+ json.type do
21
+ json.type "string"
22
+ json.description "The data type of the parameter"
23
+ end
24
+ json.required do
25
+ json.type "boolean"
26
+ json.description "Whether the parameter is required"
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ json.required ["name", "description", "parameters"]
33
+ end
@@ -0,0 +1,14 @@
1
+ <% module_namespacing do -%>
2
+ class <%= class_name %>Agent < ApplicationAgent
3
+ <% actions.each_with_index do |action, index| -%>
4
+ <% if index != 0 -%>
5
+
6
+ <% end -%>
7
+ def <%= action %>
8
+ @message = "Cats go.."
9
+
10
+ prompt message: @message
11
+ end
12
+ <% end -%>
13
+ end
14
+ <% end -%>
@@ -0,0 +1,4 @@
1
+ <% module_namespacing do -%>
2
+ class ApplicationAgent < ActiveAgent::Base
3
+ end
4
+ <% end %>
metadata CHANGED
@@ -1,15 +1,99 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activeagent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.0
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Bowen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-26 00:00:00.000000000 Z
12
- dependencies: []
11
+ date: 2024-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '7.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '7.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: actionview
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '7.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '7.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: activesupport
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '7.2'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '7.2'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activemodel
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '7.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '7.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activejob
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '7.2'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '7.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rails
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '7.2'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '7.2'
13
97
  description: A simple way to perform long running LLM background jobs and streaming
14
98
  responses
15
99
  email: jusbowen@gmail.com
@@ -17,7 +101,48 @@ executables: []
17
101
  extensions: []
18
102
  extra_rdoc_files: []
19
103
  files:
104
+ - README.md
105
+ - Rakefile
20
106
  - lib/active_agent.rb
107
+ - lib/active_agent/README.md
108
+ - lib/active_agent/action_prompt.rb
109
+ - lib/active_agent/action_prompt/README.md
110
+ - lib/active_agent/action_prompt/base.rb
111
+ - lib/active_agent/action_prompt/collector.rb
112
+ - lib/active_agent/action_prompt/message.rb
113
+ - lib/active_agent/action_prompt/prompt.rb
114
+ - lib/active_agent/base.rb
115
+ - lib/active_agent/callbacks.rb
116
+ - lib/active_agent/deprecator.rb
117
+ - lib/active_agent/engine.rb
118
+ - lib/active_agent/generation.rb
119
+ - lib/active_agent/generation_job.rb
120
+ - lib/active_agent/generation_methods.rb
121
+ - lib/active_agent/generation_provider.rb
122
+ - lib/active_agent/generation_provider/README.md
123
+ - lib/active_agent/generation_provider/base.rb
124
+ - lib/active_agent/generation_provider/open_ai_provider.rb
125
+ - lib/active_agent/generation_provider/response.rb
126
+ - lib/active_agent/inline_preview_interceptor.rb
127
+ - lib/active_agent/log_subscriber.rb
128
+ - lib/active_agent/operation.rb
129
+ - lib/active_agent/parameterized.rb
130
+ - lib/active_agent/preview.rb
131
+ - lib/active_agent/prompt_helper.rb
132
+ - lib/active_agent/queued_generation.rb
133
+ - lib/active_agent/railtie.rb
134
+ - lib/active_agent/rescuable.rb
135
+ - lib/active_agent/service.rb
136
+ - lib/active_agent/test_case.rb
137
+ - lib/active_agent/version.rb
138
+ - lib/generators/active_agent/USAGE
139
+ - lib/generators/active_agent/agent_generator.rb
140
+ - lib/generators/active_agent/templates/action.html.erb.tt
141
+ - lib/generators/active_agent/templates/action.json.jbuilder.tt
142
+ - lib/generators/active_agent/templates/agent.rb.tt
143
+ - lib/generators/active_agent/templates/agent_spec.rb.tt
144
+ - lib/generators/active_agent/templates/agent_test.rb.tt
145
+ - lib/generators/active_agent/templates/application_agent.rb.tt
21
146
  homepage: https://rubygems.org/gems/activeagent
22
147
  licenses:
23
148
  - MIT
@@ -40,5 +165,5 @@ requirements: []
40
165
  rubygems_version: 3.5.3
41
166
  signing_key:
42
167
  specification_version: 4
43
- summary: A simple way to perform long running LLM background jobs and streaming responses
168
+ summary: Rails AI Agents Framework
44
169
  test_files: []