Skip to content

Commit dce86b9

Browse files
committed
Improve Provider Deps Loading
1 parent 3f6fb83 commit dce86b9

File tree

13 files changed

+73
-170
lines changed

13 files changed

+73
-170
lines changed
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,21 @@
11
<!-- Generated from structured_output_json_parsing_test.rb:69 -->
2-
[activeagent/test/integration/structured_output_json_parsing_test.rb:69](vscode://file//Users/justinbowen/Documents/GitHub/claude-could/activeagent/test/integration/structured_output_json_parsing_test.rb:69)
2+
[activeagent/test/integration/structured_output_json_parsing_test.rb:69](vscode://file//Users/zane/Documents/Projects/quiltt/activeagent/test/integration/structured_output_json_parsing_test.rb:69)
33
<!-- Test: test-structured-output-sets-content-type-to-application/json-and-auto-parses-JSON -->
44

55
```ruby
66
# Response object
7-
#<ActiveAgent::GenerationProvider::Response:0x36b0
8-
@message=#<ActiveAgent::ActionPrompt::Message:0x36c4
7+
#<ActiveAgent::GenerationProvider::Response:0x16c0
8+
@message=#<ActiveAgent::ActionPrompt::Message:0x16c8
99
@action_id=nil,
1010
@action_name=nil,
1111
@action_requested=false,
1212
@charset="UTF-8",
13-
@content={"name"=>"John Doe", "age"=>30, "email"=>"[email protected]"},
13+
@content={"name" => "John Doe", "age" => 30, "email" => "[email protected]"},
1414
@role=:assistant>
15-
@prompt=#<ActiveAgent::ActionPrompt::Prompt:0x36d8 ...>
15+
@prompt=#<ActiveAgent::ActionPrompt::Prompt:0x16d0 ...>
1616
@content_type="application/json"
1717
@raw_response={...}>
1818

1919
# Message content
20-
response.message.content # => {"name"=>"John Doe", "age"=>30, "email"=>"[email protected]"}
20+
response.message.content # => {"name" => "John Doe", "age" => 30, "email" => "[email protected]"}
2121
```

docs/parts/examples/structured-output-json-parsing-test.rb-test-without-structured-output-uses-text/plain-content-type.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
<!-- Generated from structured_output_json_parsing_test.rb:151 -->
2-
[activeagent/test/integration/structured_output_json_parsing_test.rb:151](vscode://file//Users/justinbowen/Documents/GitHub/claude-could/activeagent/test/integration/structured_output_json_parsing_test.rb:151)
2+
[activeagent/test/integration/structured_output_json_parsing_test.rb:151](vscode://file//Users/zane/Documents/Projects/quiltt/activeagent/test/integration/structured_output_json_parsing_test.rb:151)
33
<!-- Test: test-without-structured-output-uses-text/plain-content-type -->
44

55
```ruby
66
# Response object
7-
#<ActiveAgent::GenerationProvider::Response:0x35fc
8-
@message=#<ActiveAgent::ActionPrompt::Message:0x3610
7+
#<ActiveAgent::GenerationProvider::Response:0x1700
8+
@message=#<ActiveAgent::ActionPrompt::Message:0x1708
99
@action_id=nil,
1010
@action_name=nil,
1111
@action_requested=false,
1212
@charset="UTF-8",
1313
@content="The capital of France is Paris.",
1414
@role=:assistant>
15-
@prompt=#<ActiveAgent::ActionPrompt::Prompt:0x3624 ...>
15+
@prompt=#<ActiveAgent::ActionPrompt::Prompt:0x1710 ...>
1616
@content_type="text/plain"
1717
@raw_response={...}>
1818

lib/active_agent/generation_provider/_base_provider.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,29 @@
11
require_relative "concerns/error_handling"
2+
require_relative "concerns/message_formatting"
23
require_relative "concerns/parameter_builder"
4+
require_relative "concerns/stream_processing"
5+
require_relative "concerns/tool_management"
6+
7+
require_relative "../action_prompt/action"
8+
require_relative "response"
9+
require_relative "responses_adapter"
10+
11+
GEM_LOADERS = {
12+
anthropic: [ "ruby-anthropic", "~> 0.4.2", "anthropic" ],
13+
openai: [ "ruby-openai", ">= 8.1.0", "openai" ]
14+
}
15+
16+
def require_gem!(type, file_name)
17+
gem_name, requirement, package_name = GEM_LOADERS.fetch(type)
18+
provider_name = file_name.split("/").last.delete_suffix(".rb").camelize
19+
20+
begin
21+
gem(gem_name, requirement)
22+
require(package_name)
23+
rescue LoadError
24+
raise LoadError, "The '#{gem_name}' gem is required for #{provider_name}. Please add it to your Gemfile and run `bundle install`."
25+
end
26+
end
327

428
module ActiveAgent
529
module GenerationProvider

lib/active_agent/generation_provider/anthropic_provider.rb

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,16 @@
11
# lib/active_agent/generation_provider/anthropic_provider.rb
22

3-
begin
4-
gem "ruby-anthropic", "~> 0.4.2"
5-
require "anthropic"
6-
rescue LoadError
7-
raise LoadError, "The 'ruby-anthropic ~> 0.4.2' gem is required for AnthropicProvider. Please add it to your Gemfile and run `bundle install`."
8-
end
9-
10-
require "active_agent/action_prompt/action"
113
require_relative "_base_provider"
12-
require_relative "response"
13-
require_relative "concerns/stream_processing"
14-
require_relative "concerns/message_formatting"
15-
require_relative "concerns/tool_management"
4+
5+
require_gem!(:anthropic, __FILE__)
166

177
module ActiveAgent
188
module GenerationProvider
199
class AnthropicProvider < BaseProvider
2010
include StreamProcessing
2111
include MessageFormatting
2212
include ToolManagement
13+
2314
def initialize(config)
2415
super
2516
@access_token ||= config["api_key"] || config["access_token"] || Anthropic.configuration.access_token || ENV["ANTHROPIC_ACCESS_TOKEN"]

lib/active_agent/generation_provider/ollama_provider.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
require "openai"
1+
require_relative "_base_provider"
2+
3+
require_gem!(:openai, __FILE__)
4+
25
require_relative "open_ai_provider"
36

47
module ActiveAgent

lib/active_agent/generation_provider/open_ai_provider.rb

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,14 @@
1-
begin
2-
gem "ruby-openai", ">= 8.1.0"
3-
require "openai"
4-
rescue LoadError
5-
raise LoadError, "The 'ruby-openai >= 8.1.0' gem is required for OpenAIProvider. Please add it to your Gemfile and run `bundle install`."
6-
end
7-
8-
require "active_agent/action_prompt/action"
91
require_relative "_base_provider"
10-
require_relative "response"
11-
require_relative "responses_adapter"
12-
require_relative "concerns/stream_processing"
13-
require_relative "concerns/message_formatting"
14-
require_relative "concerns/tool_management"
2+
3+
require_gem!(:openai, __FILE__)
154

165
module ActiveAgent
176
module GenerationProvider
187
class OpenAIProvider < BaseProvider
198
include StreamProcessing
209
include MessageFormatting
2110
include ToolManagement
11+
2212
def initialize(config)
2313
super
2414
@host = config["host"] || nil

lib/active_agent/generation_provider/open_router_provider.rb

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
require "openai"
1+
require_relative "_base_provider"
2+
3+
require_gem!(:openai, __FILE__)
4+
25
require_relative "open_ai_provider"
36

47
module ActiveAgent

test/agents/open_router_integration_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ class OpenRouterIntegrationTest < ActiveSupport::TestCase
164164
# https://platform.openai.com/docs/guides/pdf-files#file-urls
165165
# Accept either the OpenAI error directly or our wrapped error
166166
# Suppress ruby-openai gem's error output to STDERR
167-
error = assert_raises(ActiveAgent::GenerationProvider::Base::GenerationProviderError, OpenAI::Error) do
167+
error = assert_raises(ActiveAgent::GenerationProvider::BaseProvider::GenerationProviderError, OpenAI::Error) do
168168
prompt.generate_now
169169
end
170170

test/generation_provider/anthropic_provider_test.rb

Lines changed: 3 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,11 @@
22

33
# Test for Anthropic Provider gem loading and configuration
44
class AnthropicProviderTest < ActiveAgentTestCase
5-
# Test the gem load rescue block
6-
test "gem load rescue block provides correct error message" do
7-
# Since we can't easily simulate the gem not being available without complex mocking,
8-
# we'll test that the error message is correct by creating a minimal reproduction
9-
expected_message = "The 'ruby-anthropic ~> 0.4.2' gem is required for AnthropicProvider. Please add it to your Gemfile and run `bundle install`."
10-
11-
# Verify the rescue block pattern exists in the source code
5+
test "provider requires anthropic gem" do
126
provider_file_path = File.join(Rails.root, "../../lib/active_agent/generation_provider/anthropic_provider.rb")
13-
provider_source = File.read(provider_file_path)
14-
15-
assert_includes provider_source, "begin"
16-
assert_includes provider_source, 'gem "ruby-anthropic"'
17-
assert_includes provider_source, 'require "anthropic"'
18-
assert_includes provider_source, "rescue LoadError"
19-
assert_includes provider_source, expected_message
20-
21-
# Test the actual error by creating a minimal scenario
22-
test_code = <<~RUBY
23-
begin
24-
gem "nonexistent-anthropic-gem"
25-
require "nonexistent-anthropic-gem"
26-
rescue LoadError
27-
raise LoadError, "#{expected_message}"
28-
end
29-
RUBY
30-
31-
error = assert_raises(LoadError) do
32-
eval(test_code)
33-
end
7+
provider_source = File.read(provider_file_path)
348

35-
assert_equal expected_message, error.message
9+
assert_includes provider_source, "require_gem!(:anthropic, __FILE__)"
3610
end
3711

3812
test "loads successfully when ruby-anthropic gem is available" do

test/generation_provider/gem_loading_test.rb

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

0 commit comments

Comments
 (0)