active_harness 0.2.41 → 0.3.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/lib/active_harness/configuration.rb +3 -1
  3. data/lib/active_harness/core/errors.rb +2 -2
  4. data/lib/active_harness/core/hooks.rb +2 -2
  5. data/lib/active_harness/memory.rb +11 -11
  6. data/lib/active_harness/pipeline/README.md +15 -15
  7. data/lib/active_harness/pipeline/step.rb +1 -1
  8. data/lib/active_harness/pipeline.rb +18 -18
  9. data/lib/active_harness/providers/PROVIDER_CONTRACT.md +1 -1
  10. data/lib/active_harness/providers/audio/openai.rb +127 -0
  11. data/lib/active_harness/providers/azure.rb +1 -1
  12. data/lib/active_harness/providers/bedrock.rb +2 -2
  13. data/lib/active_harness/providers/custom.rb +1 -1
  14. data/lib/active_harness/providers/images/openrouter.rb +49 -1
  15. data/lib/active_harness/providers/vertexai.rb +2 -2
  16. data/lib/active_harness/railtie.rb +1 -1
  17. data/lib/active_harness/{agent → request}/cost.rb +1 -1
  18. data/lib/active_harness/{agent → request}/custom_llm_backend.rb +4 -4
  19. data/lib/active_harness/{agent → request}/hooks.rb +4 -4
  20. data/lib/active_harness/{agent → request}/image.rb +7 -7
  21. data/lib/active_harness/{agent → request}/models.rb +15 -15
  22. data/lib/active_harness/{agent → request}/output_parser.rb +1 -1
  23. data/lib/active_harness/{agent → request}/prompt.rb +7 -7
  24. data/lib/active_harness/{agent → request}/providers.rb +2 -1
  25. data/lib/active_harness/{agent → request}/transcription.rb +7 -7
  26. data/lib/active_harness/{agent.rb → request.rb} +19 -19
  27. data/lib/active_harness/result.rb +3 -3
  28. data/lib/active_harness/tribunal/dsl.rb +7 -7
  29. data/lib/active_harness/tribunal/hooks.rb +9 -9
  30. data/lib/active_harness/tribunal.rb +62 -62
  31. data/lib/active_harness.rb +3 -2
  32. data/lib/generators/active_harness/install/install_generator.rb +1 -1
  33. data/lib/generators/active_harness/install/templates/controllers/ai_controller.rb +3 -3
  34. data/lib/generators/active_harness/install/templates/initializers/active_harness.rb +2 -2
  35. data/lib/generators/active_harness/install/templates/pipelines/support_pipeline.rb +2 -2
  36. data/lib/generators/active_harness/install/templates/{agents/support_guard_agent.rb → requests/support_guard_request.rb} +1 -1
  37. data/lib/generators/active_harness/install/templates/{agents/support_agent.rb → requests/support_request.rb} +1 -1
  38. data/lib/generators/active_harness/install/templates/tribunals/support_guard_tribunal.rb +3 -3
  39. data/lib/generators/active_harness/pipeline/templates/pipeline.rb.tt +1 -1
  40. data/lib/generators/active_harness/request/request_generator.rb +16 -0
  41. data/lib/generators/active_harness/{agent/templates/agent.rb.tt → request/templates/request.rb.tt} +1 -1
  42. data/lib/generators/active_harness/tribunal/templates/tribunal.rb.tt +1 -1
  43. metadata +18 -17
  44. data/lib/generators/active_harness/agent/agent_generator.rb +0 -16
@@ -11,19 +11,19 @@ module ActiveHarness
11
11
  #
12
12
  # Direct usage:
13
13
  # tribunal = ActiveHarness::Tribunal.new(
14
- # input: "Is this message toxic?",
15
- # context: { user_id: 42 },
16
- # agents: [ToxicityAgent, BiasAgent, SpamAgent],
17
- # timeout: 7
14
+ # input: "Is this message toxic?",
15
+ # context: { user_id: 42 },
16
+ # requests: [ToxicityRequest, BiasRequest, SpamRequest],
17
+ # timeout: 7
18
18
  # )
19
- # tribunal.on(:after_agent) { |result| puts result.model }
19
+ # tribunal.on(:after_request) { |result| puts result.model }
20
20
  # tribunal.process { |results| results.all? { |r| r.processed["result"] == true } }
21
21
  # tribunal.call
22
22
  #
23
23
  # Subclass with DSL:
24
24
  # class ContentQualityTribunal < ActiveHarness::Tribunal
25
- # agents PolitenessAgent, ConstructivenessAgent
26
- # on(:after_agent) { |result| puts result.model }
25
+ # requests PolitenessRequest, ConstructivenessRequest
26
+ # on(:after_request) { |result| puts result.model }
27
27
  # process { |results| results.all? { |r| r.processed["result"] == true } }
28
28
  # end
29
29
  # ContentQualityTribunal.new(input: "...").call
@@ -35,11 +35,11 @@ module ActiveHarness
35
35
  class << self
36
36
  # Each subclass gets its own isolated config hash.
37
37
  def tribunal_config
38
- @tribunal_config ||= { agents: [], hooks: {} }
38
+ @tribunal_config ||= { requests: [], hooks: {} }
39
39
  end
40
40
 
41
41
  def inherited(subclass)
42
- subclass.instance_variable_set(:@tribunal_config, { agents: [], hooks: {} })
42
+ subclass.instance_variable_set(:@tribunal_config, { requests: [], hooks: {} })
43
43
  end
44
44
  end
45
45
 
@@ -54,7 +54,7 @@ module ActiveHarness
54
54
  :errors,
55
55
  :verdict,
56
56
  :execution_time,
57
- :agent_execution_times,
57
+ :request_execution_times,
58
58
  :token,
59
59
  :stream
60
60
 
@@ -63,7 +63,7 @@ module ActiveHarness
63
63
  context: {},
64
64
  params: {},
65
65
  memory: nil,
66
- agents: nil,
66
+ requests: nil,
67
67
  timeout: 7,
68
68
  token: nil,
69
69
  stream: nil,
@@ -71,28 +71,28 @@ module ActiveHarness
71
71
  )
72
72
  config = self.class.tribunal_config
73
73
 
74
- @input = input
75
- @context = context
76
- @params = params
77
- @memory = memory
78
- @agents = agents || config[:agents]
79
- @timeout = timeout
80
- @process_block = config[:process]
81
- @strategy = config[:strategy]
82
- @evaluate_block = config[:evaluate_block]
83
- @may_fail = may_fail == :_unset ? config[:may_fail] : may_fail
84
- @hooks = config[:hooks].transform_values { |v| Array(v).dup }
85
- @token = token
86
- @stream = stream
87
- @results = []
88
- @errors = []
89
- @verdict = nil
90
- @execution_time = nil
91
- @agent_execution_times = []
74
+ @input = input
75
+ @context = context
76
+ @params = params
77
+ @memory = memory
78
+ @requests = requests || config[:requests]
79
+ @timeout = timeout
80
+ @process_block = config[:process]
81
+ @strategy = config[:strategy]
82
+ @evaluate_block = config[:evaluate_block]
83
+ @may_fail = may_fail == :_unset ? config[:may_fail] : may_fail
84
+ @hooks = config[:hooks].transform_values { |v| Array(v).dup }
85
+ @token = token
86
+ @stream = stream
87
+ @results = []
88
+ @errors = []
89
+ @verdict = nil
90
+ @execution_time = nil
91
+ @request_execution_times = []
92
92
  end
93
93
 
94
94
  # Returns a Result with processed: { "verdict" => @verdict } so the pipeline
95
- # can handle agents and tribunals through the same interface.
95
+ # can handle requests and tribunals through the same interface.
96
96
  def result
97
97
  Result.new(
98
98
  input: @input,
@@ -102,55 +102,55 @@ module ActiveHarness
102
102
  )
103
103
  end
104
104
 
105
- # Run all agents in parallel, then compute the verdict.
105
+ # Run all requests in parallel, then compute the verdict.
106
106
  # Returns self so calls can be chained: tribunal.call.verdict
107
107
  #
108
108
  # Accepts an optional input to update payload before running — matches
109
- # the Agent#call(input) interface so tribunals work as pipeline executors.
109
+ # the Request#call(input) interface so tribunals work as pipeline executors.
110
110
  #
111
111
  # Behaviour on failure:
112
- # - If some agents fail/timeout, their errors are in #errors and
112
+ # - If some requests fail/timeout, their errors are in #errors and
113
113
  # #results contains only successful results.
114
- # - If ALL agents fail/timeout, raises Errors::AllAgentsFailed.
114
+ # - If ALL requests fail/timeout, raises Errors::AllRequestsFailed.
115
115
  def call(input = nil, token: nil, stream: nil)
116
116
  @input = input if input
117
117
  @token = token if token
118
118
  @stream = stream if stream
119
- agents = resolve_agents
119
+ requests = resolve_requests
120
120
  fire(:before_call)
121
121
 
122
122
  started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
123
123
 
124
- futures = agents.each_with_index.map do |agent, index|
125
- fire(:before_agent, agent, index)
124
+ futures = requests.each_with_index.map do |request, index|
125
+ fire(:before_request, request, index)
126
126
  t0 = Process.clock_gettime(Process::CLOCK_MONOTONIC)
127
- future = Concurrent::Future.execute { agent.call }
127
+ future = Concurrent::Future.execute { request.call }
128
128
  [future, t0]
129
129
  end
130
130
 
131
- @results = []
132
- @errors = []
133
- @agent_execution_times = []
131
+ @results = []
132
+ @errors = []
133
+ @request_execution_times = []
134
134
 
135
135
  futures.each_with_index do |(future, t0), index|
136
136
  future.wait(@timeout)
137
137
  elapsed = (Process.clock_gettime(Process::CLOCK_MONOTONIC) - t0).round(3)
138
- @agent_execution_times << { agent: agents[index].class.name, time: elapsed }
138
+ @request_execution_times << { request: requests[index].class.name, time: elapsed }
139
139
 
140
140
  if future.fulfilled?
141
141
  value = future.value
142
- result = value.is_a?(ActiveHarness::Agent) ? value.result : value
142
+ result = value.is_a?(ActiveHarness::Request) ? value.result : value
143
143
  @results << result
144
- fire(:after_agent, result, index)
144
+ fire(:after_request, result, index)
145
145
  elsif future.incomplete?
146
146
  error = Errors::TimeoutError.new(
147
- "Agent #{agents[index].class.name} timed out after #{@timeout}s"
147
+ "Request #{requests[index].class.name} timed out after #{@timeout}s"
148
148
  )
149
- @errors << { agent: agents[index].class.name, error: error }
150
- fire(:agent_error, agents[index].class.name, error, index)
149
+ @errors << { request: requests[index].class.name, error: error }
150
+ fire(:request_error, requests[index].class.name, error, index)
151
151
  else
152
- @errors << { agent: agents[index].class.name, error: future.reason }
153
- fire(:agent_error, agents[index].class.name, future.reason, index)
152
+ @errors << { request: requests[index].class.name, error: future.reason }
153
+ fire(:request_error, requests[index].class.name, future.reason, index)
154
154
  end
155
155
  end
156
156
 
@@ -158,7 +158,7 @@ module ActiveHarness
158
158
 
159
159
  fire(:after_call, @results, @errors)
160
160
 
161
- # If all agents failed, raise an exception.
161
+ # If all requests failed, raise an exception.
162
162
  # Otherwise, compute the verdict based on successful results.
163
163
  check_failure_threshold!
164
164
 
@@ -174,26 +174,26 @@ module ActiveHarness
174
174
 
175
175
  def check_failure_threshold!
176
176
  if !@may_fail.nil? && @errors.size > @may_fail
177
- raise Errors::AllAgentsFailed,
178
- "Too many agents failed (#{@errors.size} > may_fail: #{@may_fail}) — #{error_summary}"
177
+ raise Errors::AllRequestsFailed,
178
+ "Too many requests failed (#{@errors.size} > may_fail: #{@may_fail}) — #{error_summary}"
179
179
  elsif @results.empty?
180
- raise Errors::AllAgentsFailed, "All agents failed — #{error_summary}"
180
+ raise Errors::AllRequestsFailed, "All requests failed — #{error_summary}"
181
181
  end
182
182
  end
183
183
 
184
184
  def error_summary
185
- @errors.map { |e| "#{e[:agent]}: #{e[:error].message}" }.join("; ")
185
+ @errors.map { |e| "#{e[:request]}: #{e[:error].message}" }.join("; ")
186
186
  end
187
187
 
188
- def resolve_agents
189
- @agents.map do |agent|
190
- if agent.is_a?(Class)
191
- agent.new(input: @input, context: @context.dup, params: @params, token: @token, stream: @stream)
188
+ def resolve_requests
189
+ @requests.map do |request|
190
+ if request.is_a?(Class)
191
+ request.new(input: @input, context: @context.dup, params: @params, token: @token, stream: @stream)
192
192
  else
193
- agent.input = @input if @input
194
- agent.instance_variable_set(:@token, @token) if @token
195
- agent.instance_variable_set(:@stream, @stream) if @stream
196
- agent
193
+ request.input = @input if @input
194
+ request.instance_variable_set(:@token, @token) if @token
195
+ request.instance_variable_set(:@stream, @stream) if @stream
196
+ request
197
197
  end
198
198
  end
199
199
  end
@@ -23,17 +23,18 @@ require_relative "active_harness/providers/vertexai"
23
23
  require_relative "active_harness/providers/custom"
24
24
  require_relative "active_harness/providers/images/openai"
25
25
  require_relative "active_harness/providers/images/openrouter"
26
+ require_relative "active_harness/providers/audio/openai"
26
27
  require_relative "active_harness/providers/audio/openrouter"
27
28
  require "active_harness_pricing"
28
29
  require_relative "active_harness/memory"
29
- require_relative "active_harness/agent"
30
+ require_relative "active_harness/request"
30
31
  require_relative "active_harness/tribunal"
31
32
  require_relative "active_harness/pipeline"
32
33
 
33
34
  require_relative "active_harness/railtie" if defined?(Rails::Railtie)
34
35
 
35
36
  module ActiveHarness
36
- VERSION = "0.2.41"
37
+ VERSION = "0.3.0"
37
38
 
38
39
  class << self
39
40
  # Configure ActiveHarness.
@@ -7,7 +7,7 @@ module ActiveHarness
7
7
 
8
8
  source_root File.expand_path("templates", __dir__)
9
9
 
10
- APP_AI_DIRS = %w[agents prompts tribunals pipelines memory].freeze
10
+ APP_AI_DIRS = %w[requests prompts tribunals pipelines memory].freeze
11
11
 
12
12
  def create_structure
13
13
  APP_AI_DIRS.each do |dir|
@@ -8,7 +8,7 @@ class AiSupportController < ApplicationController
8
8
  # body: { input: "What is your return policy?" }
9
9
  # ---------------------------------------------------------------------------
10
10
  def agent
11
- result = SupportAgent.call(input: params.require(:input))
11
+ result = SupportRequest.call(input: params.require(:input))
12
12
 
13
13
  render json: {
14
14
  output: result.output,
@@ -26,7 +26,7 @@ class AiSupportController < ApplicationController
26
26
  # ---------------------------------------------------------------------------
27
27
  def agent_memory
28
28
  memory = AppMemory.new(session_id: params.require(:session_id))
29
- result = SupportAgent.call(input: params.require(:input), memory: memory)
29
+ result = SupportRequest.call(input: params.require(:input), memory: memory)
30
30
 
31
31
  render json: {
32
32
  output: result.output,
@@ -94,7 +94,7 @@ class AiSupportController < ApplicationController
94
94
 
95
95
  sse = ActionController::Live::SSE.new(response.stream, event: "message")
96
96
 
97
- SupportAgent.call(
97
+ SupportRequest.call(
98
98
  input: input,
99
99
  stream: ->(token) { sse.write({ token: token }.to_json) }
100
100
  )
@@ -74,7 +74,7 @@ ActiveHarness.configure do |config|
74
74
 
75
75
  # ---------------------------------------------------------------------------
76
76
  # Azure OpenAI Service
77
- # The `model:` in your agent config is the deployment name, not the model name.
77
+ # The `model:` in your request config is the deployment name, not the model name.
78
78
  # ---------------------------------------------------------------------------
79
79
  # config.azure_api_base = ENV["AZURE_API_BASE"] # "https://my-resource.openai.azure.com"
80
80
  # config.azure_api_key = ENV["AZURE_API_KEY"] # resource API key (preferred)
@@ -92,7 +92,7 @@ ActiveHarness.configure do |config|
92
92
  # config.custom["VLLMServer"]["url"] = "http://gpu-server:8000/v1/chat/completions"
93
93
  # config.custom["VLLMServer"]["api_key"] = ENV["VLLM_API_KEY"]
94
94
  #
95
- # Use in an agent:
95
+ # Use in a request:
96
96
  # model do
97
97
  # use provider: :custom, name: "MyLocal", model: "llama3.2"
98
98
  # fallback provider: :custom, name: "VLLMServer", model: "mixtral"
@@ -1,5 +1,5 @@
1
1
  require_relative "../tribunals/support_guard_tribunal"
2
- require_relative "../agents/support_agent"
2
+ require_relative "../requests/support_request"
3
3
 
4
4
  # Two-step pipeline: spam guard → answer.
5
5
  # Add more steps between them as needed.
@@ -11,7 +11,7 @@ class SupportPipeline < ActiveHarness::Pipeline
11
11
  end
12
12
 
13
13
  # Step 2 — RESPOND: generate the actual answer
14
- step :respond, SupportAgent
14
+ step :respond, SupportRequest
15
15
 
16
16
  before :step do |step_name, _payload|
17
17
  puts "[pipeline] → :#{step_name}"
@@ -1,6 +1,6 @@
1
1
  require_relative "../prompts/support_guard_prompt"
2
2
 
3
- class SupportGuardAgent < ActiveHarness::Agent
3
+ class SupportGuardRequest < ActiveHarness::Request
4
4
  system_prompt SupportGuardPrompt
5
5
  format :json
6
6
 
@@ -1,6 +1,6 @@
1
1
  require_relative "../prompts/support_prompt"
2
2
 
3
- class SupportAgent < ActiveHarness::Agent
3
+ class SupportRequest < ActiveHarness::Request
4
4
  system_prompt SupportPrompt
5
5
 
6
6
  model do
@@ -1,9 +1,9 @@
1
- require_relative "../agents/support_guard_agent"
1
+ require_relative "../requests/support_guard_request"
2
2
 
3
- # Runs SupportGuardAgent in parallel (single agent here, extendable).
3
+ # Runs SupportGuardRequest in parallel (single request here, extendable).
4
4
  # Verdict is true (safe) when no spam is detected.
5
5
  class SupportGuardTribunal < ActiveHarness::Tribunal
6
- agents SupportGuardAgent
6
+ requests SupportGuardRequest
7
7
 
8
8
  process do |results|
9
9
  results.none? { |r| r.processed["spam"] == true }
@@ -1,5 +1,5 @@
1
1
  class <%= class_name %>Pipeline < ActiveHarness::Pipeline
2
- step :respond, <%= class_name %>Agent
2
+ step :respond, <%= class_name %>Request
3
3
 
4
4
  before :step do |step_name, _payload|
5
5
  puts "[pipeline] → :#{step_name}"
@@ -0,0 +1,16 @@
1
+ require "rails/generators"
2
+
3
+ module ActiveHarness
4
+ module Generators
5
+ class RequestGenerator < Rails::Generators::NamedBase
6
+ source_root File.expand_path("templates", __dir__)
7
+
8
+ desc "Creates an ActiveHarness request in app/ai/requests/"
9
+
10
+ def create_request
11
+ template "request.rb.tt",
12
+ "app/ai/requests/#{file_name}_request.rb"
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,4 +1,4 @@
1
- class <%= class_name %>Agent < ActiveHarness::Agent
1
+ class <%= class_name %>Request < ActiveHarness::Request
2
2
  system_prompt <%= class_name %>Prompt
3
3
 
4
4
  model do
@@ -1,5 +1,5 @@
1
1
  class <%= class_name %>Tribunal < ActiveHarness::Tribunal
2
- agents <%= class_name %>Agent
2
+ requests <%= class_name %>Request
3
3
 
4
4
  process do |results|
5
5
  results.all? { |r| r.processed["result"] == true }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_harness
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.41
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - the-teacher
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-07-19 00:00:00.000000000 Z
11
+ date: 2026-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -46,16 +46,6 @@ extensions: []
46
46
  extra_rdoc_files: []
47
47
  files:
48
48
  - lib/active_harness.rb
49
- - lib/active_harness/agent.rb
50
- - lib/active_harness/agent/cost.rb
51
- - lib/active_harness/agent/custom_llm_backend.rb
52
- - lib/active_harness/agent/hooks.rb
53
- - lib/active_harness/agent/image.rb
54
- - lib/active_harness/agent/models.rb
55
- - lib/active_harness/agent/output_parser.rb
56
- - lib/active_harness/agent/prompt.rb
57
- - lib/active_harness/agent/providers.rb
58
- - lib/active_harness/agent/transcription.rb
59
49
  - lib/active_harness/configuration.rb
60
50
  - lib/active_harness/core/errors.rb
61
51
  - lib/active_harness/core/hooks.rb
@@ -73,6 +63,7 @@ files:
73
63
  - lib/active_harness/pipeline/step.rb
74
64
  - lib/active_harness/providers/PROVIDER_CONTRACT.md
75
65
  - lib/active_harness/providers/anthropic.rb
66
+ - lib/active_harness/providers/audio/openai.rb
76
67
  - lib/active_harness/providers/audio/openrouter.rb
77
68
  - lib/active_harness/providers/azure.rb
78
69
  - lib/active_harness/providers/base.rb
@@ -92,22 +83,30 @@ files:
92
83
  - lib/active_harness/providers/vertexai.rb
93
84
  - lib/active_harness/providers/xai.rb
94
85
  - lib/active_harness/railtie.rb
86
+ - lib/active_harness/request.rb
87
+ - lib/active_harness/request/cost.rb
88
+ - lib/active_harness/request/custom_llm_backend.rb
89
+ - lib/active_harness/request/hooks.rb
90
+ - lib/active_harness/request/image.rb
91
+ - lib/active_harness/request/models.rb
92
+ - lib/active_harness/request/output_parser.rb
93
+ - lib/active_harness/request/prompt.rb
94
+ - lib/active_harness/request/providers.rb
95
+ - lib/active_harness/request/transcription.rb
95
96
  - lib/active_harness/result.rb
96
97
  - lib/active_harness/tribunal.rb
97
98
  - lib/active_harness/tribunal/dsl.rb
98
99
  - lib/active_harness/tribunal/hooks.rb
99
100
  - lib/active_harness/tribunal/processing.rb
100
- - lib/generators/active_harness/agent/agent_generator.rb
101
- - lib/generators/active_harness/agent/templates/agent.rb.tt
102
101
  - lib/generators/active_harness/install/install_generator.rb
103
- - lib/generators/active_harness/install/templates/agents/support_agent.rb
104
- - lib/generators/active_harness/install/templates/agents/support_guard_agent.rb
105
102
  - lib/generators/active_harness/install/templates/controllers/ai_controller.rb
106
103
  - lib/generators/active_harness/install/templates/initializers/active_harness.rb
107
104
  - lib/generators/active_harness/install/templates/memory/app_memory.rb
108
105
  - lib/generators/active_harness/install/templates/pipelines/support_pipeline.rb
109
106
  - lib/generators/active_harness/install/templates/prompts/support_guard_prompt.rb
110
107
  - lib/generators/active_harness/install/templates/prompts/support_prompt.rb
108
+ - lib/generators/active_harness/install/templates/requests/support_guard_request.rb
109
+ - lib/generators/active_harness/install/templates/requests/support_request.rb
111
110
  - lib/generators/active_harness/install/templates/tribunals/support_guard_tribunal.rb
112
111
  - lib/generators/active_harness/memory/memory_generator.rb
113
112
  - lib/generators/active_harness/memory/templates/memory.rb.tt
@@ -119,6 +118,8 @@ files:
119
118
  - lib/generators/active_harness/pipeline/templates/pipeline.rb.tt
120
119
  - lib/generators/active_harness/prompt/prompt_generator.rb
121
120
  - lib/generators/active_harness/prompt/templates/prompt.rb.tt
121
+ - lib/generators/active_harness/request/request_generator.rb
122
+ - lib/generators/active_harness/request/templates/request.rb.tt
122
123
  - lib/generators/active_harness/tribunal/templates/tribunal.rb.tt
123
124
  - lib/generators/active_harness/tribunal/tribunal_generator.rb
124
125
  homepage: https://github.com/the-teacher/active_harness
@@ -143,5 +144,5 @@ requirements: []
143
144
  rubygems_version: 3.0.3.1
144
145
  signing_key:
145
146
  specification_version: 4
146
- summary: DSL for describing and running AI agents with safety layers
147
+ summary: DSL for describing and running resilient LLM requests with safety layers
147
148
  test_files: []
@@ -1,16 +0,0 @@
1
- require "rails/generators"
2
-
3
- module ActiveHarness
4
- module Generators
5
- class AgentGenerator < Rails::Generators::NamedBase
6
- source_root File.expand_path("templates", __dir__)
7
-
8
- desc "Creates an ActiveHarness agent in app/ai/agents/"
9
-
10
- def create_agent
11
- template "agent.rb.tt",
12
- "app/ai/agents/#{file_name}_agent.rb"
13
- end
14
- end
15
- end
16
- end