Module: Silas::Eval::Runner
- Defined in:
- lib/silas/eval/runner.rb
Overview
Discovers *_eval.rb files, runs each scenario in isolation against the real loop, reports, and returns a pass/fail boolean (the rake task exits 1 on false).
Class Method Summary collapse
- .report(results) ⇒ Object
- .run(dir:, pattern: nil, mode: nil, root: Rails.root) ⇒ Object
- .run_one(scenario, root = Rails.root) ⇒ Object
Class Method Details
.report(results) ⇒ Object
31 32 33 34 35 |
# File 'lib/silas/eval/runner.rb', line 31 def report(results) results.each { |r| puts r.line } failing = results.count { |r| !(r.pass? || r.skipped?) } puts "\nsilas eval: #{results.size} scenarios, #{failing} failing, #{results.count(&:skipped?)} skipped" end |
.run(dir:, pattern: nil, mode: nil, root: Rails.root) ⇒ Object
8 9 10 11 12 13 14 15 16 |
# File 'lib/silas/eval/runner.rb', line 8 def run(dir:, pattern: nil, mode: nil, root: Rails.root) Eval.reset! Dir[File.join(dir, "**/*_eval.rb")].sort.each { |f| load f } picked = Eval.scenarios.select { |s| pattern.nil? || s.name.match?(pattern) } results = picked.map { |s| run_one(s.with_mode(mode), root) } report(results) results.all? { |r| r.pass? || r.skipped? } end |
.run_one(scenario, root = Rails.root) ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/silas/eval/runner.rb', line 18 def run_one(scenario, root = Rails.root) if scenario.real? && ENV["ANTHROPIC_API_KEY"].to_s.empty? return Result.skipped(scenario, "real mode, no ANTHROPIC_API_KEY") end transcript = Driver.drive(scenario, root: root) ctx = Assertions::Context.new(transcript) ctx.instance_exec(&scenario.assertions) Result.new(scenario, ctx.failures, ctx.skips) rescue StandardError => e Result.errored(scenario, e) end |