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.
- checksums.yaml +4 -4
- data/lib/active_harness/configuration.rb +3 -1
- data/lib/active_harness/core/errors.rb +2 -2
- data/lib/active_harness/core/hooks.rb +2 -2
- data/lib/active_harness/memory.rb +11 -11
- data/lib/active_harness/pipeline/README.md +15 -15
- data/lib/active_harness/pipeline/step.rb +1 -1
- data/lib/active_harness/pipeline.rb +18 -18
- data/lib/active_harness/providers/PROVIDER_CONTRACT.md +1 -1
- data/lib/active_harness/providers/audio/openai.rb +127 -0
- data/lib/active_harness/providers/azure.rb +1 -1
- data/lib/active_harness/providers/bedrock.rb +2 -2
- data/lib/active_harness/providers/custom.rb +1 -1
- data/lib/active_harness/providers/images/openrouter.rb +49 -1
- data/lib/active_harness/providers/vertexai.rb +2 -2
- data/lib/active_harness/railtie.rb +1 -1
- data/lib/active_harness/{agent → request}/cost.rb +1 -1
- data/lib/active_harness/{agent → request}/custom_llm_backend.rb +4 -4
- data/lib/active_harness/{agent → request}/hooks.rb +4 -4
- data/lib/active_harness/{agent → request}/image.rb +7 -7
- data/lib/active_harness/{agent → request}/models.rb +15 -15
- data/lib/active_harness/{agent → request}/output_parser.rb +1 -1
- data/lib/active_harness/{agent → request}/prompt.rb +7 -7
- data/lib/active_harness/{agent → request}/providers.rb +2 -1
- data/lib/active_harness/{agent → request}/transcription.rb +7 -7
- data/lib/active_harness/{agent.rb → request.rb} +19 -19
- data/lib/active_harness/result.rb +3 -3
- data/lib/active_harness/tribunal/dsl.rb +7 -7
- data/lib/active_harness/tribunal/hooks.rb +9 -9
- data/lib/active_harness/tribunal.rb +62 -62
- data/lib/active_harness.rb +3 -2
- data/lib/generators/active_harness/install/install_generator.rb +1 -1
- data/lib/generators/active_harness/install/templates/controllers/ai_controller.rb +3 -3
- data/lib/generators/active_harness/install/templates/initializers/active_harness.rb +2 -2
- data/lib/generators/active_harness/install/templates/pipelines/support_pipeline.rb +2 -2
- data/lib/generators/active_harness/install/templates/{agents/support_guard_agent.rb → requests/support_guard_request.rb} +1 -1
- data/lib/generators/active_harness/install/templates/{agents/support_agent.rb → requests/support_request.rb} +1 -1
- data/lib/generators/active_harness/install/templates/tribunals/support_guard_tribunal.rb +3 -3
- data/lib/generators/active_harness/pipeline/templates/pipeline.rb.tt +1 -1
- data/lib/generators/active_harness/request/request_generator.rb +16 -0
- data/lib/generators/active_harness/{agent/templates/agent.rb.tt → request/templates/request.rb.tt} +1 -1
- data/lib/generators/active_harness/tribunal/templates/tribunal.rb.tt +1 -1
- metadata +18 -17
- 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:
|
|
15
|
-
# context:
|
|
16
|
-
#
|
|
17
|
-
# timeout:
|
|
14
|
+
# input: "Is this message toxic?",
|
|
15
|
+
# context: { user_id: 42 },
|
|
16
|
+
# requests: [ToxicityRequest, BiasRequest, SpamRequest],
|
|
17
|
+
# timeout: 7
|
|
18
18
|
# )
|
|
19
|
-
# tribunal.on(:
|
|
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
|
-
#
|
|
26
|
-
# on(:
|
|
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 ||= {
|
|
38
|
+
@tribunal_config ||= { requests: [], hooks: {} }
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def inherited(subclass)
|
|
42
|
-
subclass.instance_variable_set(:@tribunal_config, {
|
|
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
|
-
:
|
|
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
|
-
|
|
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
|
|
75
|
-
@context
|
|
76
|
-
@params
|
|
77
|
-
@memory
|
|
78
|
-
@
|
|
79
|
-
@timeout
|
|
80
|
-
@process_block
|
|
81
|
-
@strategy
|
|
82
|
-
@evaluate_block
|
|
83
|
-
@may_fail
|
|
84
|
-
@hooks
|
|
85
|
-
@token
|
|
86
|
-
@stream
|
|
87
|
-
@results
|
|
88
|
-
@errors
|
|
89
|
-
@verdict
|
|
90
|
-
@execution_time
|
|
91
|
-
@
|
|
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
|
|
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
|
|
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
|
|
109
|
+
# the Request#call(input) interface so tribunals work as pipeline executors.
|
|
110
110
|
#
|
|
111
111
|
# Behaviour on failure:
|
|
112
|
-
# - If some
|
|
112
|
+
# - If some requests fail/timeout, their errors are in #errors and
|
|
113
113
|
# #results contains only successful results.
|
|
114
|
-
# - If ALL
|
|
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
|
-
|
|
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 =
|
|
125
|
-
fire(:
|
|
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 {
|
|
127
|
+
future = Concurrent::Future.execute { request.call }
|
|
128
128
|
[future, t0]
|
|
129
129
|
end
|
|
130
130
|
|
|
131
|
-
@results
|
|
132
|
-
@errors
|
|
133
|
-
@
|
|
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
|
-
@
|
|
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::
|
|
142
|
+
result = value.is_a?(ActiveHarness::Request) ? value.result : value
|
|
143
143
|
@results << result
|
|
144
|
-
fire(:
|
|
144
|
+
fire(:after_request, result, index)
|
|
145
145
|
elsif future.incomplete?
|
|
146
146
|
error = Errors::TimeoutError.new(
|
|
147
|
-
"
|
|
147
|
+
"Request #{requests[index].class.name} timed out after #{@timeout}s"
|
|
148
148
|
)
|
|
149
|
-
@errors << {
|
|
150
|
-
fire(:
|
|
149
|
+
@errors << { request: requests[index].class.name, error: error }
|
|
150
|
+
fire(:request_error, requests[index].class.name, error, index)
|
|
151
151
|
else
|
|
152
|
-
@errors << {
|
|
153
|
-
fire(:
|
|
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
|
|
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::
|
|
178
|
-
"Too many
|
|
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::
|
|
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[:
|
|
185
|
+
@errors.map { |e| "#{e[:request]}: #{e[:error].message}" }.join("; ")
|
|
186
186
|
end
|
|
187
187
|
|
|
188
|
-
def
|
|
189
|
-
@
|
|
190
|
-
if
|
|
191
|
-
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
data/lib/active_harness.rb
CHANGED
|
@@ -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/
|
|
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.
|
|
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[
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
|
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 "../
|
|
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,
|
|
14
|
+
step :respond, SupportRequest
|
|
15
15
|
|
|
16
16
|
before :step do |step_name, _payload|
|
|
17
17
|
puts "[pipeline] → :#{step_name}"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
require_relative "../
|
|
1
|
+
require_relative "../requests/support_guard_request"
|
|
2
2
|
|
|
3
|
-
# Runs
|
|
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
|
-
|
|
6
|
+
requests SupportGuardRequest
|
|
7
7
|
|
|
8
8
|
process do |results|
|
|
9
9
|
results.none? { |r| r.processed["spam"] == true }
|
|
@@ -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
|
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.
|
|
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-
|
|
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
|
|
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
|