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 +4 -4
- data/lib/brute/orchestrator.rb +4 -0
- data/lib/brute/version.rb +5 -0
- data/lib/brute.rb +35 -11
- metadata +30 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 633d2e5dc4496a672f9b7024bcb214993d0a504f9e9064c781a8b0cc45256fbe
|
|
4
|
+
data.tar.gz: d1e976fffce776de48722a1fab81c418da95190a8a650ae9fced1441236e8e1e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8fb7eec94c1f2d25ea9c0da77b13e14f79922a39f3c9dde2441d5cc79a8e867bcf1dddd5a35a2b98612d226a561471ddb37b4672cc5d9ae85b341de932c25bd1
|
|
7
|
+
data.tar.gz: 4f01ad34028c009f909dbe5b348f94cffe2ee7fae602be8a75b2c199f548ef4086401d6d4e277a5124a2f26df106a6138014213feae07bd530753de6016e6500
|
data/lib/brute/orchestrator.rb
CHANGED
|
@@ -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
|
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.
|
|
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["
|
|
105
|
-
|
|
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
|
-
|
|
129
|
+
key = ENV["OPENAI_API_KEY"]
|
|
130
|
+
name = "openai"
|
|
108
131
|
elsif ENV["GOOGLE_API_KEY"]
|
|
109
|
-
|
|
132
|
+
key = ENV["GOOGLE_API_KEY"]
|
|
133
|
+
name = "google"
|
|
110
134
|
else
|
|
111
|
-
|
|
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.
|
|
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: {}
|