Skip to content

Commit 7b3cd28

Browse files
committed
Changed: Move some files around for namespacing server
1 parent aa4cf43 commit 7b3cd28

32 files changed

Lines changed: 856 additions & 808 deletions

README.md

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ See examples: [eval.rb](./examples/eval.rb), [dataset.rb](./examples/eval/datase
367367

368368
Run evaluations from the Braintrust web UI against code in your own application.
369369

370-
**Run as a Rack app**
370+
#### Run as a Rack app
371371

372372
Define evaluators, pass them to the dev server, and start serving:
373373

@@ -395,11 +395,38 @@ run Braintrust::Server::Rack.app(
395395
)
396396
```
397397

398+
Add your Rack server to your Gemfile:
399+
400+
```ruby
401+
gem "rack"
402+
gem "puma" # recommended
403+
```
404+
405+
Then start the server:
406+
398407
```bash
399408
bundle exec rackup eval_server.ru -p 8300 -o 0.0.0.0
400409
```
401410

402-
**Run as a Rails engine**
411+
See example: [server/eval.ru](./examples/server/eval.ru)
412+
413+
**Custom evaluators**
414+
415+
Evaluators can also be defined as subclasses:
416+
417+
```ruby
418+
class FoodClassifier < Braintrust::Eval::Evaluator
419+
def task
420+
->(input:) { classify(input) }
421+
end
422+
423+
def scorers
424+
[Braintrust::Scorer.new("exact_match") { |expected:, output:| output == expected ? 1.0 : 0.0 }]
425+
end
426+
end
427+
```
428+
429+
#### Run as a Rails engine
403430

404431
Use the Rails engine when your evaluators live inside an existing Rails app and you want to mount the Braintrust eval server into that application.
405432

@@ -433,29 +460,16 @@ end
433460

434461
The generator writes `config/initializers/braintrust_server.rb`, where you can review or customize the slug-to-evaluator mapping it discovers from `app/evaluators/**/*.rb` and `evaluators/**/*.rb`.
435462

436-
**Developing locally**
437-
438-
If you want to skip authentication on incoming eval requests while developing locally, set `config.auth = :none` in `config/initializers/braintrust_server.rb`.
439-
440-
That only disables authentication on requests into your Rails app. Any outgoing Braintrust API calls still require normal Braintrust credentials such as `BRAINTRUST_API_KEY`.
441-
442463
See example: [contrib/rails/eval.rb](./examples/contrib/rails/eval.rb)
443464

444-
**Custom evaluators**
465+
**Developing locally**
445466

446-
Evaluators can also be defined as subclasses:
467+
If you want to skip authentication on incoming eval requests while developing locally:
447468

448-
```ruby
449-
class FoodClassifier < Braintrust::Eval::Evaluator
450-
def task
451-
->(input:) { classify(input) }
452-
end
469+
- **For Rack**: Pass `auth: :none` to `Braintrust::Server::Rack.app(...)`
470+
- **For Rails**: Set `config.auth = :none` in `config/initializers/braintrust_server.rb`
453471

454-
def scorers
455-
[Braintrust::Scorer.new("exact_match") { |expected:, output:| output == expected ? 1.0 : 0.0 }]
456-
end
457-
end
458-
```
472+
*NOTE: Setting `:none` disables authentication on incoming requests into your server; executing evals requires a `BRAINTRUST_API_KEY` to fetch resources.*
459473

460474
**Supported web servers**
461475

@@ -468,14 +482,7 @@ The dev server requires the `rack` gem and a Rack-compatible web server.
468482
| [Passenger](https://www.phusionpassenger.com/) | 6.x | |
469483
| [WEBrick](https://github.com/ruby/webrick) | Not supported | Does not support server-sent events. |
470484

471-
Add your chosen server to your Gemfile:
472-
473-
```ruby
474-
gem "rack"
475-
gem "puma" # recommended
476-
```
477-
478-
See examples: [server/eval.ru](./examples/server/eval.ru), [contrib/rails/eval.rb](./examples/contrib/rails/eval.rb)
485+
See examples: [server/eval.ru](./examples/server/eval.ru),
479486

480487
## Documentation
481488

examples/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ BRAINTRUST_DEBUG=true ruby examples/login/login_basic.rb
3333
### Dev Server Examples
3434

3535
- **`server/eval.ru`**: Set up a dev server for remote evals — define evaluators (subclass or inline) and serve them via a Rack app. Start with: `bundle exec appraisal server rackup examples/server/eval.ru -p 8300 -o 0.0.0.0`
36-
- **`contrib/rails/eval.rb`**: Mount the dev server as a Rails engine, define evaluator classes under `app/evaluators/`, and generate `config/initializers/braintrust_server.rb` with `bin/rails generate braintrust:eval_server`
36+
- **`contrib/rails/eval.rb`**: Mount the dev server as a Rails engine, define evaluator classes under `app/evaluators/`, and generate `config/initializers/braintrust_server.rb` with `bin/rails generate braintrust:server`
3737

3838
## Coming Soon
3939

examples/contrib/rails/eval.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# This file shows one conventional setup for the Braintrust eval server in Rails:
66
# 1. Define evaluator classes under app/evaluators/
77
# 2. Generate the initializer with:
8-
# bin/rails generate braintrust:eval_server
8+
# bin/rails generate braintrust:server
99
# 3. Mount the engine in config/routes.rb
1010
#
1111
# Requirements:
@@ -31,11 +31,11 @@ def scorers
3131
# config/initializers/braintrust_server.rb
3232
# ---------------------------------------------------------------------------
3333

34-
# Generated by: bin/rails generate braintrust:eval_server
34+
# Generated by: bin/rails generate braintrust:server
3535
#
36-
# require "braintrust/server/rails"
36+
# require "braintrust/contrib/rails/server"
3737
#
38-
# Braintrust::Contrib::Rails::Engine.configure do |config|
38+
# Braintrust::Contrib::Rails::Server::Engine.configure do |config|
3939
# config.evaluators = {
4040
# "my-classifier" => MyClassifier.new
4141
# }
@@ -51,7 +51,7 @@ def scorers
5151
# ---------------------------------------------------------------------------
5252

5353
# Rails.application.routes.draw do
54-
# mount Braintrust::Contrib::Rails::Engine, at: "/braintrust"
54+
# mount Braintrust::Contrib::Rails::Server::Engine, at: "/braintrust"
5555
# end
5656

5757
puts "Braintrust Rails Engine example — see comments for usage"

lib/braintrust/contrib/rails/application_controller.rb

Lines changed: 0 additions & 32 deletions
This file was deleted.

lib/braintrust/contrib/rails/engine.rb

Lines changed: 0 additions & 66 deletions
This file was deleted.

lib/braintrust/contrib/rails/eval_controller.rb

Lines changed: 0 additions & 34 deletions
This file was deleted.

lib/braintrust/contrib/rails/health_controller.rb

Lines changed: 0 additions & 13 deletions
This file was deleted.

lib/braintrust/contrib/rails/list_controller.rb

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# frozen_string_literal: true
2+
3+
begin
4+
require "action_controller"
5+
require "rails/engine"
6+
rescue LoadError
7+
raise LoadError,
8+
"Rails (actionpack + railties) is required for the Braintrust Rails server engine. " \
9+
"Add `gem 'rails'` or `gem 'actionpack'` and `gem 'railties'` to your Gemfile."
10+
end
11+
12+
require "json"
13+
require_relative "../../eval"
14+
require_relative "../../server/sse"
15+
require_relative "../../server/auth/no_auth"
16+
require_relative "../../server/auth/clerk_token"
17+
require_relative "../../server/middleware/cors"
18+
require_relative "../../server/services/list_service"
19+
require_relative "../../server/services/eval_service"
20+
require_relative "server/engine"
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# frozen_string_literal: true
2+
3+
module Braintrust
4+
module Contrib
5+
module Rails
6+
module Server
7+
class ApplicationController < ActionController::API
8+
before_action :authenticate!
9+
10+
private
11+
12+
def authenticate!
13+
auth_result = Engine.auth_strategy.authenticate(request.env)
14+
unless auth_result
15+
render json: {"error" => "Unauthorized"}, status: :unauthorized
16+
return
17+
end
18+
19+
request.env["braintrust.auth"] = auth_result
20+
@braintrust_auth = auth_result
21+
end
22+
23+
def parse_json_body
24+
body = request.body.read
25+
return nil if body.nil? || body.empty?
26+
JSON.parse(body)
27+
rescue JSON::ParserError
28+
nil
29+
end
30+
end
31+
end
32+
end
33+
end
34+
end

0 commit comments

Comments
 (0)