brute 0.1.0 → 0.1.3

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: d81acc813055cd8621c71b3d1c444b9c39cf9c316b0e4b41eddab60a3f27f85a
4
- data.tar.gz: 746bd2d574c6203e80153d0c747e55cecff746b5aa61ae1b38c9471aaee8feef
3
+ metadata.gz: 633d2e5dc4496a672f9b7024bcb214993d0a504f9e9064c781a8b0cc45256fbe
4
+ data.tar.gz: d1e976fffce776de48722a1fab81c418da95190a8a650ae9fced1441236e8e1e
5
5
  SHA512:
6
- metadata.gz: c18662ee0a25508ebd7df4015454b4b6e77eb7fa7e5a3f69fe2b9b1e64a8f0392fd1478cde5e5f310c85e1a683302346cc0528cb20beab80705029331ed7e4e7
7
- data.tar.gz: 60047800ecee00b2c959ca9f12385540b2be949ebfffa3f16312dc534a0342a82e5bebe0227228461e2fcba634a76a38df7d3c70bcada0c40a3be37f82c156c0
6
+ metadata.gz: 8fb7eec94c1f2d25ea9c0da77b13e14f79922a39f3c9dde2441d5cc79a8e867bcf1dddd5a35a2b98612d226a561471ddb37b4672cc5d9ae85b341de932c25bd1
7
+ data.tar.gz: 4f01ad34028c009f909dbe5b348f94cffe2ee7fae602be8a75b2c199f548ef4086401d6d4e277a5124a2f26df106a6138014213feae07bd530753de6016e6500
@@ -91,6 +91,10 @@ module Brute
91
91
  #
92
92
  # Returns the final assistant response.
93
93
  def run(user_message)
94
+ unless @provider
95
+ raise "No LLM provider configured. Set LLM_API_KEY and optionally LLM_PROVIDER (default: anthropic)"
96
+ end
97
+
94
98
  @request_count = 0
95
99
 
96
100
  # Build the initial prompt with system message on first turn
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Brute
4
+ VERSION = "0.1.3"
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.0"
65
+ VERSION = "0.1.3"
66
66
 
67
67
  # The complete set of tools available to the agent.
68
68
  TOOLS = [
@@ -100,21 +100,45 @@ module Brute
100
100
  )
101
101
  end
102
102
 
103
+ PROVIDERS = {
104
+ "anthropic" => ->(key) { LLM.anthropic(key: key).tap { Patches::AnthropicToolRole.apply! } },
105
+ "openai" => ->(key) { LLM.openai(key: key) },
106
+ "google" => ->(key) { LLM.google(key: key) },
107
+ "deepseek" => ->(key) { LLM.deepseek(key: key) },
108
+ "ollama" => ->(key) { LLM.ollama(key: key) },
109
+ "xai" => ->(key) { LLM.xai(key: key) },
110
+ }.freeze
111
+
112
+ # Resolve the LLM provider from environment variables.
113
+ #
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)
119
+ #
120
+ # Returns nil if no key is found. Error is deferred to Orchestrator#run.
103
121
  def self.resolve_provider
104
- if ENV["ANTHROPIC_API_KEY"]
105
- LLM.anthropic(key: ENV["ANTHROPIC_API_KEY"]).tap { Patches::AnthropicToolRole.apply! }
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"
106
128
  elsif ENV["OPENAI_API_KEY"]
107
- LLM.openai(key: ENV["OPENAI_API_KEY"])
129
+ key = ENV["OPENAI_API_KEY"]
130
+ name = "openai"
108
131
  elsif ENV["GOOGLE_API_KEY"]
109
- LLM.google(key: ENV["GOOGLE_API_KEY"])
132
+ key = ENV["GOOGLE_API_KEY"]
133
+ name = "google"
110
134
  else
111
- raise <<~MSG
112
- No API key found. Set one of:
113
- ANTHROPIC_API_KEY
114
- OPENAI_API_KEY
115
- GOOGLE_API_KEY
116
- MSG
135
+ return nil
117
136
  end
137
+
138
+ factory = PROVIDERS[name]
139
+ raise "Unknown LLM provider: #{name}. Available: #{PROVIDERS.keys.join(", ")}" unless factory
140
+
141
+ factory.call(key)
118
142
  end
119
143
 
120
144
  private_class_method :resolve_provider
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: brute
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brute Contributors
@@ -37,6 +37,34 @@ dependencies:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
39
  version: '2.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: minitest
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '5.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '5.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
40
68
  description: Production-grade coding agent with tool execution, middleware pipeline,
41
69
  context compaction, session persistence, and multi-provider LLM support.
42
70
  executables: []
@@ -78,6 +106,7 @@ files:
78
106
  - lib/brute/tools/shell.rb
79
107
  - lib/brute/tools/todo_read.rb
80
108
  - lib/brute/tools/todo_write.rb
109
+ - lib/brute/version.rb
81
110
  licenses:
82
111
  - MIT
83
112
  metadata: {}