claude_swarm 0.3.5 → 0.3.6

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: 3d72ab4034667cbfd6719b79c3a3aeff7ae93fdf7adc850b910edfcda8c4fe92
4
- data.tar.gz: 48f3b2151b39a4aad0bc09ac089a6eb98911b82e4e7f1eb029e7541462a2efc6
3
+ metadata.gz: b13f053c52c3e4ff662746f5027fcc6005be35ab6621c827b5fac205bb69b917
4
+ data.tar.gz: 70d1fbedfa25a81060259f37b4de2d47c740d8719171ce956a5462ce022359d2
5
5
  SHA512:
6
- metadata.gz: 9f23d4f5086dac9ee9e112476d7e0aa1f4e39af367ef542829665989a17610e382f21b9c396f2118aab04cca56758286580a20a57be6ced893beddea49137890
7
- data.tar.gz: c487d6321ae3f07e5310eb94e08ab1a45bc98628df6f82ad7cf5e74bb323358189310efeeb29b31c456ed61b0a61934c92aca0535d93947e8598a4192f97a6f6
6
+ metadata.gz: 60b9dbc2a41ae296a4a4d844c5dbf1195e26a38a4ce90aeb72a23f86467e94bc803e5b7488f8189829ad5a898a0887d1a639dc888adf24af87c4d391346709ac
7
+ data.tar.gz: 4935a7b7001b78d0a8ae1f4f732f61aed8d4fc35859478615f035edd2411ea5f9b5df3be1e26f910ad8ce8943c750d3b51f22adf3c105bbd97c5a36b17b072e9
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [0.3.6]
2
+
3
+ ### Added
4
+ - **SSE MCP server headers support**: SSE-type MCP servers can now include custom headers for authentication
5
+ - Supports headers like `Authorization: "Bearer ${TOKEN}"` in MCP configurations
6
+ - Environment variables in header values are automatically interpolated
7
+ - **Comprehensive retry middleware for OpenAI API calls**: Added robust retry logic for OpenAI provider to handle API errors gracefully
8
+ - Automatically retries on rate limit errors (429) with exponential backoff
9
+ - Retries on server errors (500, 502, 503, 504) and timeout errors
10
+ - Configurable retry attempts, delay, and backoff settings
11
+ - Detailed logging of retry attempts and errors
12
+
1
13
  ## [0.3.5]
2
14
 
3
15
  ### Changed
data/README.md CHANGED
@@ -389,6 +389,9 @@ mcps:
389
389
  - name: remote_api
390
390
  type: sse
391
391
  url: "https://api.example.com/mcp"
392
+ headers: # Optional: custom headers for authentication
393
+ Authorization: "Bearer ${API_TOKEN}"
394
+ X-Custom-Header: "value"
392
395
  ```
393
396
 
394
397
  ### Tools
@@ -265,7 +265,8 @@ module ClaudeSwarm
265
265
  sdk_options = ClaudeSDK::ClaudeCodeOptions.new
266
266
 
267
267
  # Basic options
268
- sdk_options.model = @model if @model
268
+ # Only set model if ANTHROPIC_MODEL env var is not set
269
+ sdk_options.model = @model if @model && !ENV["ANTHROPIC_MODEL"]
269
270
  sdk_options.cwd = @working_directory
270
271
  sdk_options.resume = @session_id if @session_id && !options[:new_session]
271
272
 
@@ -90,7 +90,9 @@ module ClaudeSwarm
90
90
  {
91
91
  "type" => "sse",
92
92
  "url" => mcp["url"],
93
- }
93
+ }.tap do |config|
94
+ config["headers"] = mcp["headers"] if mcp["headers"]
95
+ end
94
96
  end
95
97
  end
96
98
 
@@ -146,7 +146,29 @@ module ClaudeSwarm
146
146
  }
147
147
  config[:uri_base] = @base_url if @base_url
148
148
 
149
- @openai_client = ::OpenAI::Client.new(config)
149
+ @openai_client = ::OpenAI::Client.new(config) do |faraday|
150
+ # Add retry middleware with custom configuration
151
+ faraday.request(
152
+ :retry,
153
+ max: 3, # Maximum number of retries
154
+ interval: 0.5, # Initial delay between retries (in seconds)
155
+ interval_randomness: 0.5, # Randomness factor for retry intervals
156
+ backoff_factor: 2, # Exponential backoff factor
157
+ exceptions: [
158
+ Faraday::TimeoutError,
159
+ Faraday::ConnectionFailed,
160
+ Faraday::ServerError, # Retry on 5xx errors
161
+ ],
162
+ retry_statuses: [429, 500, 502, 503, 504], # HTTP status codes to retry
163
+ retry_block: lambda do |env:, options:, retry_count:, exception:, will_retry:|
164
+ if will_retry
165
+ @logger.warn("Request failed (attempt #{retry_count}/#{options.max}): #{exception&.message || "HTTP #{env.status}"}. Retrying in #{options.interval * (options.backoff_factor**(retry_count - 1))} seconds...")
166
+ else
167
+ @logger.warn("Request failed after #{retry_count} attempts: #{exception&.message || "HTTP #{env.status}"}. Giving up.")
168
+ end
169
+ end,
170
+ )
171
+ end
150
172
  rescue KeyError
151
173
  raise ExecutionError, "OpenAI API key not found in environment variable: #{token_env}"
152
174
  end
@@ -516,11 +516,13 @@ module ClaudeSwarm
516
516
  end
517
517
 
518
518
  def build_main_command(instance)
519
- parts = [
520
- "claude",
521
- "--model",
522
- instance[:model],
523
- ]
519
+ parts = ["claude"]
520
+
521
+ # Only add --model if ANTHROPIC_MODEL env var is not set
522
+ unless ENV["ANTHROPIC_MODEL"]
523
+ parts << "--model"
524
+ parts << instance[:model]
525
+ end
524
526
 
525
527
  # Add resume flag if restoring session
526
528
  if @restore_session_path
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ClaudeSwarm
4
- VERSION = "0.3.5"
4
+ VERSION = "0.3.6"
5
5
  end
data/lib/claude_swarm.rb CHANGED
@@ -23,6 +23,7 @@ require "yaml"
23
23
  # External dependencies
24
24
  require "claude_sdk"
25
25
  require "fast_mcp_annotations"
26
+ require "faraday/retry"
26
27
  require "mcp_client"
27
28
  require "openai"
28
29
  require "thor"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: claude_swarm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paulo Arruda
@@ -51,6 +51,20 @@ dependencies:
51
51
  - - "~>"
52
52
  - !ruby/object:Gem::Version
53
53
  version: '0.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: faraday-retry
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '2.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '2.0'
54
68
  - !ruby/object:Gem::Dependency
55
69
  name: fast-mcp-annotations
56
70
  requirement: !ruby/object:Gem::Requirement