brute 0.1.2 → 0.1.4

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fa9acc014adfa80301780aa8bc76e26fec90b9005dd3bd1a778d2807963374ca
4
- data.tar.gz: ee086a3b83d49a20ede439d5b421111032087bb70edb462da0dd00a45491dbb6
3
+ metadata.gz: 00321403d71ffc3436dee9ef35b063168d57448fb49351a8f014c24a4a61c8d1
4
+ data.tar.gz: dcacc199a078595364ccaf4dc71b892a629362813e955300bfb1fa3646fd4353
5
5
  SHA512:
6
- metadata.gz: 7ae63658a5f0c921a0ea4d0ad34a3c3b494a1965451f2d32022d543b1a24224f6ad25251bf323492d34f2d3e33ef4343ae322b592198d8b72d278cfcefc0b041
7
- data.tar.gz: 6c5121ce297a25b8631edbb2712ce4fcdf27fa7f55404f9fd169e71f8765ab3d71fe41164c4740e61977c49dc4494ed8db417b36a7744f7b52a69c53bc2d215c
6
+ metadata.gz: b7c4e919815f9592b56e75b74ed8474e91d06f88fc680f4ab201179eec5eae5a6e48b1eac0a3eceb814b80cc341b84a7d1ea2ae06ee64e9697610573d449cc6f
7
+ data.tar.gz: 75bec05d5b2e501ef8f6fe461d8f448a628afa5b57ed745b3cbcd722ccfc19bea1b60dce035f653b6c05182f84bc9943fe7b3515d427033603862559282f1f65
@@ -16,13 +16,26 @@ module Brute
16
16
  # (streaming delivers chunks incrementally via AgentStream)
17
17
  unless env[:streaming]
18
18
  if (cb = env.dig(:callbacks, :on_content)) && response
19
- text = response.respond_to?(:content) ? response.content : nil
19
+ text = safe_content(response)
20
20
  cb.call(text) if text
21
21
  end
22
22
  end
23
23
 
24
24
  response
25
25
  end
26
+
27
+ private
28
+
29
+ # Safely extract text content from an LLM response.
30
+ # Returns nil when the response contains only tool calls (no assistant text),
31
+ # which causes LLM::Contract::Completion#content to raise NoMethodError
32
+ # because messages.find(&:assistant?) returns nil.
33
+ def safe_content(response)
34
+ return nil unless response.respond_to?(:content)
35
+ response.content
36
+ rescue NoMethodError
37
+ nil
38
+ end
26
39
  end
27
40
  end
28
41
  end
data/lib/brute/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Brute
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.4"
5
5
  end
data/lib/brute.rb CHANGED
@@ -62,7 +62,7 @@ require_relative "brute/tools/delegate"
62
62
  require_relative "brute/orchestrator"
63
63
 
64
64
  module Brute
65
- VERSION = "0.1.2"
65
+ VERSION = "0.1.3"
66
66
 
67
67
  # The complete set of tools available to the agent.
68
68
  TOOLS = [
@@ -111,15 +111,30 @@ module Brute
111
111
 
112
112
  # Resolve the LLM provider from environment variables.
113
113
  #
114
- # LLM_API_KEY — the API key (required)
115
- # LLM_PROVIDER — provider name (default: "anthropic")
114
+ # Checks in order:
115
+ # 1. LLM_API_KEY + LLM_PROVIDER (explicit)
116
+ # 2. ANTHROPIC_API_KEY (implicit: provider = anthropic)
117
+ # 3. OPENAI_API_KEY (implicit: provider = openai)
118
+ # 4. GOOGLE_API_KEY (implicit: provider = google)
116
119
  #
117
- # Returns nil if LLM_API_KEY is not set. Error is deferred to Orchestrator#run.
120
+ # Returns nil if no key is found. Error is deferred to Orchestrator#run.
118
121
  def self.resolve_provider
119
- key = ENV["LLM_API_KEY"]
120
- return nil unless key
122
+ if ENV["LLM_API_KEY"]
123
+ key = ENV["LLM_API_KEY"]
124
+ name = ENV.fetch("LLM_PROVIDER", "anthropic").downcase
125
+ elsif ENV["ANTHROPIC_API_KEY"]
126
+ key = ENV["ANTHROPIC_API_KEY"]
127
+ name = "anthropic"
128
+ elsif ENV["OPENAI_API_KEY"]
129
+ key = ENV["OPENAI_API_KEY"]
130
+ name = "openai"
131
+ elsif ENV["GOOGLE_API_KEY"]
132
+ key = ENV["GOOGLE_API_KEY"]
133
+ name = "google"
134
+ else
135
+ return nil
136
+ end
121
137
 
122
- name = ENV.fetch("LLM_PROVIDER", "anthropic").downcase
123
138
  factory = PROVIDERS[name]
124
139
  raise "Unknown LLM provider: #{name}. Available: #{PROVIDERS.keys.join(", ")}" unless factory
125
140
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brute
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brute Contributors
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
10
+ date: 1980-01-01 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: llm.rb